1. System.gc()方法的調(diào)用
2. 老年代不足
3. 永久代不足
4. concurrent mode failure
concurrent mode failure是在執(zhí)行CMS GC的過程中同時(shí)有對(duì)象要放入老年代,而此時(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沒有對(duì)內(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后存活的年輕代對(duì)象會(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)