Java: 逃逸分析

概述:

對象一般都是在堆上生成的,也不是絕對的,特例:逃逸分析。

JVM 在分析代碼之後,發現一個對象在聲明之後只有在當前運行的函數中調用,那麼就會將這個對象在棧上申請空間,而不是在堆上。

這就是JDK6上的逃逸分析。

因爲在棧上申請的對象函數執行完畢後直接清理,就大大減少了GC的壓力。


demo:

 傳入的value應當大於127或小於-128。

編輯運行的模式,設置堆的大小爲10M,並設置打印GC的過程。

JDK6默認開了逃逸分析通過設置-XX:-DoEscapeAnalysis來關閉逃逸分析:

設置爲10M是爲了儘快進入GC。

 

不斷打印了GC的過程,空間又滿了又進入GC。

這是因爲new 對象會在堆上申請空間。所以會瘋狂GC.

現在打開逃逸分析:

 

 幾次GC後就不再GC了。這就是逃逸分析。

逃逸分析是分析了當前對象只在當前函數範圍內使用,因而改爲在棧上申請空間。棧是函數運行完就立刻清理的,不需要等到GC,緩解了GC的壓力。

如果不是隻在當前函數範圍內用到的對象不行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章