Minor GC、Major GC、Full GC的區別
阿新 • • 發佈:2021-09-06
今天主要談談JVM GC的型別和策略,特別是大家經常混淆的Minor GC、Major GC、Full GC,年輕代GC、老年代GC,之間有什麼區別和聯絡。
Minor GC
JVM堆記憶體被分為兩部分:年輕代(Young Generation)和老年代(Old Generation)。
1.年輕代
年輕代是所有新物件產生的地方,當年輕代記憶體空間被用完時,就會觸發垃圾回收,這個垃圾回收叫做Minor GC。
年輕代被分為3個部分——Enden區和兩個Survivor區,年輕代空間的要點:
- 大多數新建的物件都位於Eden區。
- 當Eden區被物件填滿時,就會執行Minor GC。並把所有存活下來的物件轉移到其中一個survivor區。
- Minor GC同樣會檢查存活下來的物件,並把它們轉移到另一個survivor區。這樣在一段時間內,總會有一個空的survivor區。
- 經過多次GC週期後,仍然存活下來的物件會被轉移到年老代記憶體空間。通常這是在年輕代有資格提升到年老代前通過設定年齡閾值來完成的。
2.年老代
年老代記憶體裡包含了長期存活的物件和經過多次Minor GC後依然存活下來的物件,通常會在老年代記憶體被佔滿時進行垃圾回收。
Major GC
老年代的垃圾收集叫做Major GC,Major GC通常是跟full GC是等價的,收集整個GC堆。
Minor GC和Major GC其實就是年輕代GC和年老年GC的俗稱。而在Hotspot VM具體實現的收集器:Serial GC, Parallel GC, CMS, G1 GC中,大致可以對應到某個Young GC和Old GC演算法組合。
分代GC
針對HotSpot VM的實現,其實GC的準確分類可以分為:
- 分代GC
- Full GC
以及後續的G1的分割槽收集本質其實還是一個分代收集器,但是和之前的各類回收器不同,它同時兼顧年輕代和老年代。
分代GC並不收集整個GC堆的模式,而是隻專注分代收集
- Young GC:只收集年輕代的GC
- Old GC:只收集年老代的GC(只有CMS的concurrent collection是這個模式)
- Mixed GC:收集整個young gen以及部分old gen的GC(只有G1有這個模式)
Full GC
Full GC定義是相對明確的,就是針對整個新生代、老生代、元空間(metaspace,java8以上版本取代perm gen)的全域性範圍的GC。