物件優先在Eden區分配
大多數情況下,物件在Eden區進行分配。
當Eden區沒有足夠的空間來進行分配時,就會觸發Young GC(Minor GC)。
當觸發Young GC時,如果Survivor區不夠放存活的物件,那麼就會觸發分配擔保機制提前轉移到老年代。
大物件直接進入老年代
大物件的問題:
1、容易導致記憶體明明還有不少空間時就提前觸發垃圾收集。
2、複製大物件時需要高額的記憶體複製開銷。
HotSpot提供了-XX:PretenureSizeThreshold ,指定了大於該設定值的物件直接在老年代分配,目的是為了避免大物件在Eden及兩個Surivor區之間的來回複製。
長期存活的物件將進入老年代
虛擬機器給每個物件定義了一個物件年齡的計數器,儲存在物件頭中。
每次經歷Young GC且仍存活的物件,都會加一歲。當到達指定的年齡(預設15歲)就會進入到老年代。
動態物件的年齡判斷
HotSpot虛擬機器並不是一定要求物件達到指定年齡才能進入老年代。
當某一個年齡(x)的所有物件的大小佔survivor區大於一半時,那麼年齡≥x的物件都會晉升到老年代。
GC的觸發條件
Young GC
當年輕代空間不足時,就會觸發Young GC。
Old GC
當老年代記憶體不足時,會觸發Old GC。
Full GC
觸發條件:
1、老年代或者元空間記憶體不足
2、System.gc()方法呼叫
3、堆記憶體分配擔保失敗(大物件)