Java中的逃逸分析

逃逸分析(Escape Analysis)是目前Java虛擬機中比較前沿的優化技術。

逃逸分析的基本行為就是分析對象動態作用域:當一個對象在方法中被定義後,它可能被外部方法所引用,例如作為調用參數傳遞到其他地方中,稱為方法逃逸。

在Java的編譯體系中,一個Java的源代碼文件變成計算機可執行的機器指令的過程中,需要經過兩段編譯,第一段是把.java文件轉換成.class文件。第二段編譯是把.class轉換成機器指令的過程。

public static StringBuffer craeteStringBuffer(String s1, String s2) {

StringBuffer sb = new StringBuffer();

sb.append(s1);

sb.append(s2);

return sb;

}

StringBuffer sb是一個方法內部變量,上述代碼中直接將sb返回,這樣這個StringBuffer有可能被其他方法所改變,這樣它的作用域就不只是在方法內部,雖然它是一個局部變量,稱其逃逸到了方法外部。

Java中的逃逸分析

甚至還有可能被外部線程訪問到,譬如賦值給類變量或可以在其他線程中訪問的實例變量,稱為線程逃逸。

同步省略

在動態編譯同步塊的時候,JIT編譯器可以藉助逃逸分析來判斷同步塊所使用的鎖對象是否只能夠被一個線程訪問而沒有被髮布到其他線程。

如果同步塊所使用的鎖對象通過這種分析被證實只能夠被一個線程訪問,那麼JIT編譯器在編譯這個同步塊的時候就會取消對這部分代碼的同步。這個取消同步的過程就叫同步省略,也叫鎖消除。

如以下代碼:

public void f() {

Object hollis = new Object();

synchronized(hollis) {

System.out.println(hollis);

}

}

最後,棧上的空間一般而言是非常小的,只能存放若干變化和小的數據結構,大容量的存儲結構是做不到。這裡的例子是一個極端的千萬次級的循環,突出了通過逃逸分析,讓其直接從棧上分配,從而極大降低了GC的次數,提升了程序整體的執行效能。

所以,逃逸分析的效果只能在特定場景下,滿足高頻和高數量的容量比較小的變量分配結構,才可以生效。

尚學堂立志解決中國教育不公平和低效率問題,幫助千千萬萬被傳統教育方式耽誤的人,傳授實用、前沿的知識,成就學員個人理想,為愛你的人和你愛的人創造美好的生活。尚學堂12大精英團隊+各類實戰項目,真正實現1+1>10的目標效果。幫助學員迅速成長,持久騰飛,成就學員“高富帥”人生。


分享到:


相關文章: