天天看點

JVM中GC什麼時候開始進行?

GC 經常發生的區域是堆區,堆區還可以細分為新生代、老年代,新生代還分為一個 Eden 區和兩個 Survivor 區。

對象優先在 Eden 中配置設定,當 Eden 中沒有足夠空間時,虛拟機将發生一次 Minor GC,因為 Java 大多數對象都是朝生夕滅,是以 Minor GC 非常頻繁,而且速度也很快;

Full GC,發生在老年代的 GC,當老年代沒有足夠的空間時即發生 Full GC,發生 Full GC 一般都會有一次 Minor GC。

大對象直接進入老年代,如很長的字元串數組,虛拟機提供一個;XX:PretenureSizeThreadhold 參數,令大于這個參數值的對象直接在老年代中配置設定,避免在 Eden 區和兩個 Survivor 區發生大量的記憶體拷貝;

發生 Minor GC 時,虛拟機會檢測之前每次晉升到老年代的平均大小是否大于老年代的剩餘空間大小,

如果大于,則進行一次 Full GC,

如果小于,則檢視 HandlePromotionFailure 設定是否允許擔保失敗,如果允許,那隻會進行一次 Minor GC,如果不允許,則改為進行一次 Full GC。

繼續閱讀