深入理解Java虛擬機器 --- 記憶體分配與回收策略

ayu0v0發表於2024-11-08

物件優先在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、堆記憶體分配擔保失敗(大物件)

相關文章