記憶體分配和GC觸發
物件分配
- 優先在Eden區分配。當Eden區沒有足夠空間分配時, VM發起一次Minor GC, 將 Eden區和其中一塊Survivor區內尚存活的物件放入另一塊Survivor區域。如Minor GC時survivor空間不夠,物件提前進入老年代,老年代空間不夠時進行Full GC;
- 大物件直接進入老年代,避免在Eden區和Survivor區之間產生大量的記憶體複製, 此 外大物件容易導致還有不少空閒記憶體就提前觸發GC以獲取足夠的連續空間.
物件晉級
- 年齡閾值:VM為每個物件定義了一個物件年齡(Age)計數器, 經第一次Minor GC後 仍然存活, 被移動到Survivor空間中, 並將年齡設為1. 以後物件在Survivor區中每熬 過一次Minor GC年齡就+1. 當增加到一定程度(-XX:MaxTenuringThreshold, 預設 15), 將會晉升到老年代.
- 提前晉升: 動態年齡判定;如果在Survivor空間中相同年齡所有物件大小的總和大 於Survivor空間的一半, 年齡大於或等於該年齡的物件就可以直接進入老年代, 而無 須等到晉升年齡.
從年輕代空間(包括 Eden 和 Survivor 區域)回收記憶體被稱為 Minor GC, 對老年代GC稱為Major GC,而Full GC是對整個堆來說;
Minor GC觸發條件:當Eden區滿時,觸發Minor GC。
Full GC觸發條件:
- System.gc()
- 老年代空間不足
- 永生區空間不足
- 統計得到的MinorGC晉升到舊生代的平均大小大於老年代 的剩餘空間
- 堆中分配很大的物件