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