Minor GC
JVM堆內(nèi)存被分為兩部分:年輕代(Young Generation)和老年代(Old Generation)。
1.年輕代
年輕代是所有新對象產(chǎn)生的地方。當年輕代內(nèi)存空間被用完時,就會觸發(fā)垃圾回收。這個垃圾回收叫做Minor GC。年輕代被分為3個部分——Enden區(qū)和兩個Survivor區(qū)。
年輕代空間的要點:
- 大多數(shù)新建的對象都位于Eden區(qū)。
- 當Eden區(qū)被對象填滿時,就會執(zhí)行Minor GC。并把所有存活下來的對象轉(zhuǎn)移到其中一個survivor區(qū)。
- Minor GC同樣會檢查存活下來的對象,并把它們轉(zhuǎn)移到另一個survivor區(qū)。這樣在一段時間內(nèi),總會有一個空的survivor區(qū)。
- 經(jīng)過多次GC周期后,仍然存活下來的對象會被轉(zhuǎn)移到年老代內(nèi)存空間。通常這是在年輕代有資格提升到年老代前通過設定年齡閾值來完成的。
2.年老代
年老代內(nèi)存里包含了長期存活的對象和經(jīng)過多次Minor GC后依然存活下來的對象。通常會在老年代內(nèi)存被占滿時進行垃圾回收。
Major GC
老年代的垃圾收集叫做Major GC,Major GC通常是跟full GC是等價的,收集整個GC堆。
Minor GC和Major GC其實就是年輕代GC和年老年GC的俗稱。而在Hotspot VM具體實現(xiàn)的收集器:Serial GC, Parallel GC, CMS, G1 GC中,大致可以對應到某個Young GC和Old GC算法組合。
分代GC
針對HotSpot VM的實現(xiàn),其實GC的準確分類可以分為:
- 分代GC
- Full GC
以及后續(xù)的G1的分區(qū)收集本質(zhì)其實還是一個分代收集器,但是和之前的各類回收器不同,它同時兼顧年輕代和老年代。
分代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。