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