1. 程式人生 > >JVM-記憶體分配

JVM-記憶體分配

Java體系中所提倡的自動記憶體管理最終可以歸結為自動化地解決兩個問題:給物件分配記憶體以及回收分配給物件的記憶體

heap(堆)區:Eden space(伊甸區)、survivor space(倖存者區)、old age(老年代)

大多數情況下,物件在新生代Eden(伊甸)區中分配。當Eden區沒有足夠空間進行分配時,虛擬機器將發起一次Minor GC。

新生代GC(Minor GC):指發生在新生代的垃圾收集動作,因為Java物件大多具有朝生夕滅的特性,所以Minor GC非常頻繁,一般回收速度也比較快。

老年代GC(Major GC/Full GC):指發生在老年代的GC,出現了Major GC,經常會伴隨至少一次的Minor GC(但非絕對,Parallel Scavenge的收集策略就有直接Major GC的策略選擇過程)。Major GC的速度一般會比Minor GC慢10倍以上。

Minor GC觸發條件:當Eden區滿時,觸發Minor GC。

Full GC觸發條件:

(1)呼叫System.gc時,系統建議執行Full GC,但是不必然執行

(2)老年代空間不足

(3)方法區空間不足

(4)通過Minor GC後進入老年代的平均大小大於老年代的可用記憶體

(5)由Eden區、From Space區向To Space區複製時,物件大小大於To Space可用記憶體,則把該物件轉存到老年代,且老年代的可用記憶體小於該物件大小

大物件直接進入老年代。(比如:很長的字串以及陣列)

長期存活的物件將進入老年代。(虛擬機器給每個物件定義一個物件年齡計數器(age),如果物件在Eden區出生並經過第一次Minor GC後仍然存活,並且能被Servivor容納的話,將被移動到Survivor空間中,並且物件年齡設為1。物件在Survivor區中每熬過一次Minor GC,年齡就增加1歲,當它的年齡增加到一定程度(預設是15歲),就將會被晉升到老年代中。還有一種動態物件年齡判定:如果Survivor空間中相同年齡所有物件大小總和大於Survivor空間的一半,年齡大於或等於該年齡的物件就可以直接進入老年代。)