九:內存分配與回收策略

1.對象優先在新生代的Eden區進行分配

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

2.大對象直接進入老年代

3.長期存活的對象將進入到老年代(虛擬機設置值,默認閾值爲15)

爲了能夠識別哪些對象存在新生代,哪些老年代,虛擬機給每個對象定義 了一個對象年齡(Age)計數器。如果對象在Eden出生並經過第一次 Minor gc後仍然存 活,並且能被 Survivor容納的話,將被移動到 Survivor空間中,並且對象年齡設爲1。對象在Survivor區中每“熬過”一次 Minor Go,年齡就增加1歲,當它的年齡增加到一定程 度(默認爲15歲),就將會被晉升到老年代中。對象晉升老年代的年齡閾值,可以通過參 數-XX: MaxTenuringThreshold設置。

4.動態對象年齡判定,如果Survivor區中相同年齡所有對象的大小總和大於Survivor區空間一半,年齡大於或者等於該年齡的對象在MinorGC時將複製到老年代

因此,對象的年齡並不是一定要等到MaxTenuringThreshold設置的參數值才晉升到老年代

5.空間分配擔保,當MinorGC時,如果存活對象過多,無法完全放入Survivor區,就會向老年代借用內存存放對象,以確保完成MinorGC

JDK1.6之後的規則爲:只要老年代的連續空間大於新生代對象總大小或者歷次晉升的平均大小就會進行Minor GC,否則將進行 Full GC。

 

Minor GC和 Full GC有什麼不一樣?

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

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

 

爲什麼需要空間分配擔保機制?

每一次Minor GC都是有一定風險的,因爲在Minor GC的時候有可能出現大量對象存活的情況,這時候Survivor區就有可能存放不下,所以就需要使用空間分配擔保機制來將新生代中存放不下的對象直接進入老年代。

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