概述:
對象一般都是在堆上生成的,也不是絕對的,特例:逃逸分析。
JVM 在分析代碼之後,發現一個對象在聲明之後只有在當前運行的函數中調用,那麼就會將這個對象在棧上申請空間,而不是在堆上。
這就是JDK6上的逃逸分析。
因爲在棧上申請的對象函數執行完畢後直接清理,就大大減少了GC的壓力。
demo:
傳入的value應當大於127或小於-128。
編輯運行的模式,設置堆的大小爲10M,並設置打印GC的過程。
JDK6默認開了逃逸分析通過設置-XX:-DoEscapeAnalysis來關閉逃逸分析:
設置爲10M是爲了儘快進入GC。
不斷打印了GC的過程,空間又滿了又進入GC。
這是因爲new 對象會在堆上申請空間。所以會瘋狂GC.
現在打開逃逸分析:
幾次GC後就不再GC了。這就是逃逸分析。
逃逸分析是分析了當前對象只在當前函數範圍內使用,因而改爲在棧上申請空間。棧是函數運行完就立刻清理的,不需要等到GC,緩解了GC的壓力。
如果不是隻在當前函數範圍內用到的對象不行。