GC 經常發生的區域是堆區,堆區還可以細分為新生代、老年代
jvm堆示意圖
新生代
- 一個 Eden 區
- 兩個 Survivor 區
老年代
- 默認 新生代(Young)與老年代(Old)的比例的值為
1:2
(該值可以通過參數–XX:NewRatio
來指定)。 - 默認的
Eden:from:to=8:1:1
(可以通過參數–XX:SurvivorRatio
來設定)。
新生代GC(MinorGC/YoungGC)
指發生在新生代的垃圾收集動作,因為 Java 對象大多都具備朝生夕滅的特性,所以 MinorGC 非常頻繁,一般回收速度也比較快。
老年代GC(MajorGC/FullGC)
指發生在老年代的 GC,出現了 MajorGC,經常會伴隨至少一次的 MinorGC(但非絕對的,在 Parallel Scavenge 收集器的收集策略里就有直接進行 MajorGC 的策略選擇過程)。MajorGC 的速度一般會比 MinorGC 慢 10 倍以上。
什么情況下會出現 Young GC?
對象優先在新生代 Eden 區中分配,如果 Eden 區沒有足夠的空間時,就會觸發一次 Young GC 。
什么情況下回出現 Full GC?
Full GC 的觸發條件有多個,FULL GC 的時候會 STOP THE WORD 。
- 在執行 Young GC 之前,JVM 會進行空間分配擔保——如果老年代的連續空間小於新生代對象的總大小(或歷次晉升的平均大小),則觸發一次 Full GC 。
- 大對象直接進入老年代,從年輕代晉升上來的老對象,嘗試在老年代分配內存時,但是老年代內存空間不夠。
- 顯式調用
System.gc()
方法時。