JVM系列:MinorGC、MajorGC、FullGC垃圾回收
?今天給大家繼續(xù)分享MinorGC、MajorGC、FullGC相關(guān)知識(shí),如有不對(duì)的地方歡迎指正!?
1、MinorGC (新生代垃圾回收)?
JDK1.8 堆內(nèi)部結(jié)構(gòu)
從年輕代空間(包括 Eden 和 Survivor 區(qū)域)回收內(nèi)存被稱為 Minor GC,也叫Young GC。因?yàn)镴ava對(duì)象大多具備朝生夕死的特征,所以MinorGC非常頻繁,一般回收速度也比較快。一般采用復(fù)制算法。?
說(shuō)明:Minor GC可能會(huì)引發(fā)STW,暫停其他用戶的線程,需要等JVM垃圾回收結(jié)束后,用戶線程才恢復(fù)運(yùn)行。?
Minor GC 觸發(fā)條件
- Eden伊甸園區(qū)滿了?
- 新new的對(duì)象需要分配到新生代的Eden伊甸園區(qū),當(dāng)Eden區(qū)的空間不夠的時(shí)候需要進(jìn)行MinorGC策略回收,?
2、Major GC(老年代垃圾回收)?
Major GC指發(fā)生在老年代的GC。?
Major GC觸發(fā)條件
- 老年代空間不足時(shí),會(huì)先嘗試觸發(fā)Minor GC。Minor GC之后空間還不足,則會(huì)觸發(fā)Major GC。?
- 說(shuō)明:發(fā)生在老年代的GC ,基本上進(jìn)行一次Major GC 就會(huì)伴隨進(jìn)行一次 Minor GC。Major GC 的速度一般會(huì)比 Minor GC 慢 10 倍,并且STW的時(shí)間更長(zhǎng)。?
3、Full GC (新生代+老年代垃圾回收)?
Full GC可以理解為Major GC+Minor GC組合后進(jìn)行的一整個(gè)過(guò)程,是清理JVM整個(gè)堆空間(年輕代和老年代空間)。?
Full GC觸發(fā)條件
- 調(diào)用System.gc()方法時(shí),可通過(guò)-XX:+ DisableExplicitGC 參數(shù)來(lái)禁止調(diào)用System.gc()?。
- 當(dāng)方法區(qū)空間不足時(shí)?。
- Minor GC后存活的對(duì)象大小超過(guò)了老年代剩余空間?。
- Minor GC時(shí)中Survivor幸存區(qū)空間不足時(shí),判斷是否允許擔(dān)保失敗,不允許則觸發(fā)Full GC。允許,并且每次晉升到老年代的對(duì)象平均大小>老。年代最大可用連續(xù)內(nèi)存空間,也會(huì)觸發(fā)Full GC?。
- CMS GC異常,CMS運(yùn)行期間預(yù)留的內(nèi)存無(wú)法滿足程序需要,就會(huì)出現(xiàn)一次“Concurrent Mode Failure”失敗,會(huì)觸發(fā)Full GC?。
STW(Stop The World):垃圾回收發(fā)生過(guò)程中,會(huì)產(chǎn)生應(yīng)用程序的停頓現(xiàn)象。停頓產(chǎn)生的時(shí)候整個(gè)應(yīng)用程序線程都會(huì)被暫停,有點(diǎn)應(yīng)用程序像卡死的情況。?