新生代GC(Minor GC):指發(fā)生在新生代的垃圾收集動作,因為Java對象大多都具備朝生夕死的特性,所以Minor GC非常頻繁,一般回收速度也比較快。
老年代GC(Major GC / Full GC):指發(fā)生在老年代的GC,出現(xiàn)了Major GC,經(jīng)常會伴隨至少一次的Minor GC(并非絕對的)。Major GC的速度一般會比Minor GC慢10倍以上。
1. 對象優(yōu)先在Eden分配
大多數(shù)情況下,對象在新生代Eden區(qū)中分配。當(dāng)Eden區(qū)沒有足夠的空間進行分配時,虛擬機將會發(fā)起一次Minor GC。
2. 大對象直接進入老年代
大對象:需要大量連續(xù)的內(nèi)存空間的對象。大對象對虛擬機的內(nèi)存分配來說,是一個壞消息,一個更壞的消息是遇到一大批短命的大對象。
3. 長期存活的對象將進入老年代
虛擬機給每個對象定義了一個對象年齡(Age)計數(shù)器,如果對象在Edge出生并經(jīng)過第一次Minor GC后讓然存活,并且能被Survivor容納的話,將被移動到Survivor空間中,并將年齡設(shè)為1。對象在Survivor中沒熬過一次Minor GC,年齡就會增加1,當(dāng)它的年齡增加到一定的程度(默認15歲)時,就會被晉升到老年代。老年代的年齡閥值,可以通過參數(shù)-XX:MaxTenuringThreshold設(shè)置。
4. 動態(tài)對象年齡判定
為了能更好的適應(yīng)不同程序的內(nèi)存狀況,虛擬機并不總是要求對象的年齡必須達到MaxTenuringThreshold才能晉升老年代。
如果在Survivor空間中相同年齡所有對象大小的總和大于Survivor空間的一半,那么年齡大于或等于該年齡的對象就可以直接進入老年代,無需等到MaxTenuringThreshold要求的年齡。
5. 空間分配擔(dān)保
在發(fā)生Minor GC時,虛擬機會檢測之前每次晉升到老年代的平均大小是否大于老年代的剩余空間大小,如果大于,則改為直接進行一次Full GC。如果小于,則查看HandlePromotionFailure設(shè)置是否運行擔(dān)保失?。蝗绻试S,那只會進行Minor GC;如果不允許,則也改為一次Full GC。(不太理解)