Full GC 的一些常見原因

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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容