1.現(xiàn)象
發(fā)現(xiàn)某線上服務(wù)(jdk1.8袋坑、G1算法),old區(qū)只在fullgc階段回收(也就是說(shuō)沒(méi)有觸發(fā)mixed gc)
如下圖所示,雖然平時(shí)都進(jìn)行g(shù)c固棚,但是old區(qū)沒(méi)有減少藏澳,只有fullgc的時(shí)候仁锯,old區(qū)才被回收
線上服務(wù)對(duì)應(yīng)的gc參數(shù)為:
-XX:InitiatingHeapOccupancyPercent=70??-XX:G1NewSizePercent=40
2.G1
G1核心邏輯:
通過(guò)將內(nèi)存劃分若干個(gè)Region區(qū)域,可以做到gc時(shí)只回收部分內(nèi)存笆载,同時(shí)借助多核加速Region回收速度扑馁。將停頓時(shí)間變得可預(yù)測(cè)(通過(guò)調(diào)整回收內(nèi)存大小涯呻,控制gc時(shí)間)、避免了內(nèi)存碎片
old區(qū)和young區(qū)大小處于動(dòng)態(tài)變化過(guò)程中腻要,根據(jù)預(yù)測(cè)算法复罐,結(jié)合-XX:MaxGCPauseMillis參數(shù),動(dòng)態(tài)調(diào)整兩者內(nèi)存比例雄家,以及mixed gc回收old比例效诅,將gc停頓時(shí)間盡可能控制在參數(shù)以內(nèi)
G1中主要存在3種gc算法:
Young GC:選定所有年輕代里的Region。G1是通過(guò)調(diào)整年輕代大小趟济,控制年輕代Region數(shù)量來(lái)控制YGC的開(kāi)銷乱投。
Mixed GC:選定所有年輕代里的Region,外加根據(jù)global concurrent marking統(tǒng)計(jì)得出收集收益高的部分老年代Region顷编,在用戶指定的停頓時(shí)間目標(biāo)范圍內(nèi)盡可能選擇收益高的老年代Region回收戚炫,G1就是通過(guò)控制回收老年代Region數(shù)量來(lái)控制Mixed GC的開(kāi)銷的。
FullGC:Serial Old GC
只有Mixed gc 和Full gc會(huì)回收old區(qū)
在G1中有關(guān)鍵的3個(gè)參數(shù):
-XX:InitiatingHeapOccupancyPercent:默認(rèn)值45媳纬,超過(guò)這個(gè)值双肤,開(kāi)始觸發(fā)全局標(biāo)記,進(jìn)而觸發(fā)mixed gc钮惠,注意這個(gè)值表示的是:老年區(qū)已使用空間/整個(gè)堆空間
-XX:G1NewSizePercent:默認(rèn)值5%茅糜,新生代最小值
-XX:G1MaxNewSizePercent:默認(rèn)值60%,新生代最大值
3.InitiatingHeapOccupancyPercent之坑
當(dāng)時(shí)線上的gc參數(shù)配置如下:
-XX:InitiatingHeapOccupancyPercent=70??-XX:G1NewSizePercent=40
可以發(fā)現(xiàn)問(wèn)題:
XX:G1NewSizePercent = 40 (young區(qū)占用40%)導(dǎo)致 old區(qū)最多有 60%的空間素挽,無(wú)法達(dá)到 -XX:InitiatingHeapOccupancyPercent=70蔑赘,永遠(yuǎn)觸發(fā)不了全局標(biāo)記、mixedgc了预明,導(dǎo)致老年代回收不了缩赛,一直擠壓等到fullgc,才能回收old區(qū)
相關(guān)的問(wèn)題贮庞,也被提給jdk官方:
https://bugs.openjdk.org/browse/JDK-8151176
https://bugs.openjdk.org/browse/JDK-8142484
可以看到這個(gè)問(wèn)題峦筒,在高版本的jdk9,已經(jīng)被修復(fù)窗慎,不存在這個(gè)問(wèn)題了物喷。但是使用低版本的jdk,還要注意這個(gè)坑
4. 驗(yàn)證
我們將gc參數(shù)調(diào)整為:
-XX:InitiatingHeapOccupancyPercent=40??-XX:G1NewSizePercent=10 -XX:G1MaxNewSizePercent=35
將young區(qū)控制在35%以下遮斥,上線效果如下峦失,可以看到老年代不在持續(xù)增加,會(huì)跟隨mixed gc回收术吗,不在觸發(fā)fullgc(會(huì)導(dǎo)致較長(zhǎng)的STW尉辑,以及oom)