JVM逃逸分析 - JVM優化技術
阿新 • • 發佈:2018-12-05
概念
逃逸分析,是一種可以有效減少Java程式中同步負載和記憶體堆分配壓力的跨函式全域性資料流分析演算法。通過逃逸分析,Java Hotspot編譯器能夠分析出一個新的物件的引用的使用範圍從而決定是否要將這個物件分配到堆上。
在計算機語言編譯器優化原理中,逃逸分析是指分析指標動態範圍的方法,它同編譯器優化原理的指標分析和外形分析相關聯。當變數(或者物件)在方法中分配後,其指標有可能被返回或者被全域性引用,這樣就會被其他過程或者執行緒所引用,這種現象稱作指標(或者引用)的逃逸(Escape)。
簡單的概括下,逃逸分析的基本行為就是分析物件動態作用域,當一個物件在方法中被定義後,它可能被外部方法所引用,稱為方法逃逸。甚至還有可能被外部執行緒訪問到,譬如賦值給類變數或可以在其他執行緒中訪問的例項變數,稱為執行緒逃逸。
例項
方法逃逸的幾種方式:
public class EscapeTest {
public static Object obj;
public void globalVariableEscape() { // 給全域性變數賦值,發生逃逸
obj = new Object();
}
public Object methodEscape() { // 方法返回值,發生逃逸
return new Object();
}
public void instanceEscape() { // 例項引用發生逃逸
test (this);
}
}
優化技術
棧上分配
如果能夠通過逃逸分析確定物件不會被外部訪問到,可以將該物件在棧上分配記憶體。棧上分配就是把方法中的變數和物件分配到棧上,方法執行完後自動銷燬,而不需要垃圾回收的介入,從而提高系統性能。
同步消除
執行緒同步本身比較耗時,如果確定一個物件不會逃逸出執行緒,無法被其它執行緒訪問到,那該物件的讀寫就不會存在競爭。單執行緒中是沒有鎖競爭。(鎖和鎖塊內的物件不會逃逸出執行緒就可以把這個同步塊取消)
標量替換
原始資料型別(int,long等數值型別以及reference型別等)稱為標量,建立物件時通過建立某方法使用到的成員變數來代替。
逃逸分析對效能的影響可參考 深入分析JVM逃逸分析對效能的影響。