1. System.gc()方法的調用
2. 老年代不足
3. 永久代不足
4. concurrent mode failure
concurrent mode failure是在執行CMS GC的過程中同時有對象要放入老年代,而此時老年代空間不足造成的(有時候“空間不足”是CMS GC時當前的浮動垃圾過多導致暫時性的空間不足觸發Full GC)。
相關參數:-XX:+UseCMSInitiatingOccupancyOnly ,如果沒有設置此參數,虛擬機會根據收集的數據決定是否觸發(建議線上環境帶上這個參數,不然會加大問題排查的難度)。
相關參數:-XX:CMSInitiatingOccupancyFraction=80,即老年代滿80%時觸發CMS GC。設置太高,就容易產生concurrent mode failure,設置過低,CMS GC又太過頻繁。
相關參數:-XX:UseCMSCompactAtFullCollection=true,由于CMS沒有對內存進行壓縮,所以會有內存碎片,設置此參數,默認每次執行Full GC的時候會進行整理壓縮,目前默認是true。
相關參數:-XX:CMSFullGCsBeforeCompaction=n,指定多少次不壓縮的CMS GC剛才之后,跟著來一次帶壓縮的CMS GC。默認是0,表示每次發生forground的cms gc 都會進行壓縮,但壓縮會影響暫停時間,因此可以適當調整次參數。
5.?promotion failed
minor gc時年輕代的存活區空間不足而晉升老年代,老年代又空間不足而觸發full gc。
相關參數: -XX:SurvivorRatio=8,設置eden和survivor的比例,默認8:1。
相關參數: -XX:MaxTenuringThreshold=15,最多經過多少次minor gc后存活的年輕代對象會晉升老年代,默認15。
6. 統計得到的Minor GC晉升到舊生代的平均大小大于老年代的剩余空間
當準備要觸發一次young GC時,如果發現統計數據說之前young GC的平均晉升大小比目前old gen剩余的空間大,則不會觸發young GC而是轉為觸發full GC(因為HotSpot VM的GC里,除了CMS的concurrent collection之外,其它能收集old gen的GC都會同時收集整個GC堆,包括young gen,所以不需要事先觸發一次單獨的young GC)。
原文鏈接:https://www.zhihu.com/question/41922036/answer/93079526)