什么是新生代 GC 和老年代 GC


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() 方法時。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM