1.JVM FullGC 觸發條件彙總

一共5種場景

1.System.gc()
程序中顯式的調用System.gc(),有可能會觸發Full GC。(比如NIO中的直接內存使用)使用-XX:-+DisableExplicitGC 參數,可以禁用。

2.老年代空間不足
這個空間不足有兩種,一種是分配一個對象,空間真的不足。另一種是由於內存碎片,導致沒有連續內存空間來分配給對象。

3.CMS GC時出現空間分配擔保失敗和concurrent mode failure
promotion failed 空間分配擔保失敗 ,Minor GC之前,會比較“老年代剩餘空間”與“新生代所有對象之和”的大小,如果老年代剩餘空間大於新生代之和,則本次Minor GC一定是安全的,反之,去看參數是否允許擔保失敗,不允許,則會觸發一次Full GC
concurrent mode failure CMS無法處理浮動垃圾,因爲CMS運行和程序運行是並行的,標記之後產生的垃圾cms處理不了,此時程序如果申請一塊兒空間,內存不夠,就會發生concurrent mode failure 。此時虛擬機會啓用serial old收集器來進行老年代的回收,停頓時間會很長。

4.之前歷次minorGC晉升到老年代的對象平均大小如果大於此時老年代的剩餘空間,也會導致一次Full GC。

5.metaspace空間不足也會造成Full GC。

6.當YGC時會做出檢查是否進行Full GC:
採用Parallel GC的情況下,當YGC觸發時,會有兩個檢查:
1、在YGC執行前,min(目前新生代已使用的大小,之前平均晉升到old的大小中的較小值) > 舊生代剩餘空間大小 ? 不執行YGC,直接執行Full GC : 執行YGC;
2、在YGC執行後,平均晉升到old的大小 > 舊生代剩餘空間大小 ? 觸發Full GC : 什麼都不做。

在寫代碼的時候,先嚐試了直接new一個大對象,但直接這麼做會在Full GC之前觸發一次Young GC,測試下來加了 -XX:-ScavengeBeforeFullGC 也還是會先Young GC (Full GC (Allocation Failure)之前)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章