逃逸分析是分析指標可以儲存的所有地方,用於判斷指標是否能確保在當前執行緒。
我理解的就是用來分析,乙個物件是否僅在某個執行緒被訪問到。
在jit時,進行逃逸分析後,就可以確定物件僅在某一線程中被訪問到,這樣jit就可以對其方法進行優化。
包括:1.堆分配轉化為棧分配
2.鎖消除
3.分離物件或標量替換
具體方式見下文。
1.物件被賦值給堆中的變數或者類的靜態變數
2.物件被傳進了不確定的**中執行
下面舉幾個例子
public class escapetest
public void instanceobjectescape(
)
public object returnobjectescape(
) public void noescape(
) object noescape = new object(
); //僅建立執行緒可見,物件無逃逸}}
1.堆分配轉化為棧分配
如果乙個物件的指標不會發生逃逸,那麼就可以把該物件分配在棧上,這樣在棧幀彈出時**該物件,不用等到gc時,從而降低gc壓力和頻率。
2.鎖消除
如果乙個物件不會發生逃逸,只被乙個執行緒訪問,那麼在這個物件上的操作就不需要進行同步
3.分離物件或標量替換
如果乙個物件不會發生逃逸,可以將該物件分解成乙個個基本變數,分配棧上。這樣有兩點好處,1.不用再生成物件頭,從而減少開銷。2.空間**更為高效,同其他棧分配資源。
1.堆分配轉化為棧分配
虛擬機器配置引數:-xx:+printgc -xms20m -xmn20m -xx:+doescapeanalysis
-xx:+doescapeanalysis表示開啟逃逸分析,jdk8是預設開啟的
-xx:+printgc 表示列印gc資訊
-xms20m -xmn20m 設定jvm記憶體大小是20m
)執行結果,沒有進行頻繁的gc
將逃逸分析關閉 -xx:-doescapeanalysis
再次執行
發生頻繁的gc
2.鎖消除
虛擬機器配置引數:-xx:+printgc -xms500m -xmn500m -xx:+doescapeanalysis。配置500m是保證不觸發gc。
開啟逃逸分析時,用了4毫秒。
注意這個耗時,跟不加鎖的上面測試是一致的。
現在關閉逃逸分析再測
用了111ms。
以上
JVM物件逃逸分析 JVM記憶體
jvm的執行模式有三種 解釋模式 interpreted mode 只使用直譯器 xint 強制jvm使用解釋模式 執行一行jvm位元組碼就編譯一行為機器碼 編譯模式 compiled mode 只使用編譯器 xcomp jvm使用編譯模式 先將所有jvm位元組碼一次編譯為機器碼,然 後一次性執行所...
JVM 問題排查分析下篇(案例實戰)
這一部分,我們來看乙個實際的案例。假設我們有乙個提供高併發請求的服務,系統使用 spring boot 框架,指標採集使用 micrometer,監控資料上報給 datadog 服務。有關micrometer的資訊可參考 問題現象描述最近一段時間,通過監控指標發現,有乙個服務節點的最大 gc 暫停時...
Windows藍屏故障分析及排除實戰案例
windows藍屏故障分析及排除實戰案例 2011年09月28日 藍屏崩潰宕機 blue screen of death 是windows較為常見的系統故障之一。發生藍屏崩潰故障,則表明windows系統遇到了嚴重的危險程式或錯誤程式,而又無法自我修復,被迫強制關機以避免損壞電腦系統。因此,作為電腦...