整理自 周志明《深入JVM》
1, 是JVM優化技術,它不是直接優化手段,而是為其它優化手段提供依據。
2,逃逸分析主要就是分析對象的動态作用域。
3,逃逸有兩種:方法逃逸和線程逃逸。
方法逃逸(對象逃出目前方法):
當一個對象在方法裡面被定義後,它可能被外部方法所引用,例如作為調用參數傳遞到其它方法中。
線程逃逸((對象逃出目前線程):
這個對象甚至可能被其它線程通路到,例如指派給類變量或可以在其它線程中通路的執行個體變量
4,如果不存在逃逸,則可以對這個變量進行優化
1,棧上配置設定。
在一般應用中,不會逃逸的局部對象占比很大,如果使用棧上配置設定,那大量對象會随着方法結束而自動銷毀,垃圾回收系統壓力就小很多。
2,同步消除
線程同步本身比較耗時,如果确定一個變量不會逃逸出線程,無法被其它線程通路到,那這個變量的讀寫就不會存在競争,對這個變量的同步措施
可以清除。
3,标量替換。
1, 标量就是不可分割的量,java中基本資料類型,reference類型都是标量。相對的一個資料可以繼續分解,它就是聚合量(aggregate)。
2, 如果把一個對象拆散,将其成員變量恢複到基本類型來通路就叫做标量替換。
3, 如果逃逸分析證明一個對象不會被外部通路,并且這個對象可以被拆散的話,那麼程式真正執行的時候将可能不建立這個對象,而改為直接在>棧上建立若幹個成員變量。
5,逃逸分析還不成熟。
1,不能保證逃逸分析的性能收益必定高于它的消耗。
判斷一個對象是否逃逸耗時長,如果分析完發現沒有幾個不逃逸的對象,那時間就白白浪費了。
2,基于逃逸分析的優化手段不成熟,如上面提到的棧上配置設定,由于hotspot目前的實作方式導緻棧上配置設定實作起來複雜。
6,相關JVM參數
-XX:+DoEscapeAnalysis 開啟逃逸分析
-XX:+PrintEscapeAnalysis 開啟逃逸分析後,可通過此參數檢視分析結果。
-XX:+EliminateAllocations 開啟标量替換
-XX:+EliminateLocks 開啟同步消除
-XX:+PrintEliminateAllocations 開啟标量替換後,檢視标量替換情況。