1、對象優先在 Eden 分配
大多數情況下,對象在新生代 Eden 區分配,當 Eden 區空間不夠時,發起 Minor GC。
2、大對象直接進入老年代
大對象是指需要連續內存空間的對象,最典型的大對象是那種很長的字符串以及數組。
經常出現大對象會提前觸發垃圾收集以獲取足夠的連續空間分配給大對象。
-XX:PretenureSizeThreshold,大于此值的對象直接在老年代分配,避免在 Eden 區和 Survivor 區之間的大量內存復制。
3、長期存活的對象進入老年代
為對象定義年齡計數器,對象在 Eden 出生并經過 Minor GC 依然存活,將移動到 Survivor 中,年齡就增加 1 歲,增加到一定年齡則移動到老年代中。
-XX:MaxTenuringThreshold 用來定義年齡的閾值。
4、動態對象年齡判定
虛擬機并不是永遠地要求對象的年齡必須達到 MaxTenuringThreshold 才能晉升老年代,如果在 Survivor 中相同年齡所有對象大小的總和大于 Survivor 空間的一半,則年齡大于或等于該年齡的對象可以直接進入老年代,無需等到 MaxTenuringThreshold 中要求的年齡。
5、空間分配擔保
在發生 Minor GC 之前,虛擬機先檢查老年代最大可用的連續空間是否大于新生代所有對象總空間,如果條件成立的話,那么 Minor GC 可以確認是安全的。
如果不成立的話虛擬機會查看 HandlePromotionFailure 設置值是否允許擔保失敗,如果允許那么就會繼續檢查老年代最大可用的連續空間是否大于歷次晉升到老年代對象的平均大小,如果大于,將嘗試著進行一次 Minor GC;如果小于,或者 HandlePromotionFailure 設置不允許冒險,那么就要進行一次 Full GC。