jvm 工具篇-(3)-G1-案例-調(diào)優(yōu)過(guò)程

1.啟動(dòng)參數(shù):

-Xmx8g -Xms8g -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=30 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=2 -XX:+PrintGCDetails -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC  -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=52001 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=xx.xx.xx.xx

參數(shù)含義見(jiàn):jvm-G1

2.運(yùn)行5天+

image.png

3.剛啟動(dòng)時(shí)監(jiān)控:

 平均在50ms
image.png

4.5天后監(jiān)控:

平均在150ms,還在上漲


image.png

5.問(wèn)題已經(jīng)很明顯了

就是隨著使用的時(shí)長(zhǎng)延續(xù),導(dǎo)致yonggc tp拉高,我的應(yīng)用是每天拉高10~20ms左右,這個(gè)對(duì)于提供webServcie服務(wù)也是不能接受的。

5.1只能了解下G1的工作原理

G1本質(zhì)上也有分代回收,只不過(guò)從內(nèi)存劃分上和cms等回收方式有了很大的不同
? ? ? ? cms等回收器,內(nèi)存分配,還是eden區(qū)---Survivor--old
? ? ? ? cms回收器,內(nèi)存回收算法,復(fù)制算法+標(biāo)記整理+標(biāo)記清除
? ? ? ? g1回收器,內(nèi)存分配,將整個(gè)堆空間,全部打散分成 X mb的空間,X是可以設(shè)定的-XX:G1HeapRegionSize=Xm X是2的n次冪,2~32m(我的機(jī)器設(shè)置的16m,分塊數(shù)=8*1024/16=512塊)。
區(qū)域:Eden區(qū) Survivor區(qū) Old區(qū) Humongous區(qū)。 這里Humongous區(qū)是巨大的空間,也就是連續(xù)的region組成的。如果一個(gè)對(duì)象占用的空間超過(guò)了分區(qū)容量50%以上,G1收集器就認(rèn)為這是一個(gè)巨型對(duì)象。這些巨型對(duì)象,默認(rèn)直接會(huì)被分配在年老代,但是如果它是一個(gè)短期存在的巨型對(duì)象,就會(huì)對(duì)垃圾收集器造成負(fù)面影響。為了解決這個(gè)問(wèn)題,G1劃分了一個(gè)Humongous區(qū),它用來(lái)專門存放巨型對(duì)象。
? ? ? ? g1回收器,內(nèi)存回收算法,復(fù)制算法+
? ? ? ? g1-yonggc:
? ? ? ? ? ? ? ? 階段1:根掃描靜態(tài)和本地對(duì)象被掃描
? ? ? ? ? ? ? ? 階段2:更新RS處理dirty card隊(duì)列更新RS
? ? ? ? ? ? ? ? 階段3:處理RS檢測(cè)從年輕代指向年老代的對(duì)象
? ? ? ? ? ? ? ? 階段4:對(duì)象拷貝拷貝存活的對(duì)象到survivor/old區(qū)域
? ? ? ? ? ? ? ? 階段5:處理引用隊(duì)列軟引用,弱引用,虛引用處理
? ? ? ? g1-mixgc:
? ? ? ? ? ? ? ? 初始標(biāo)記(initial mark,STW)在此階段,G1 GC 對(duì)根進(jìn)行標(biāo)記。
? ? ? ? ? ? ? ? 根區(qū)域掃描(root region scan)G1 GC 在初始標(biāo)記的存活區(qū)掃描對(duì)老年代的引用,并標(biāo)記被引用的對(duì)象。該階段與應(yīng)用程序(非 STW)同時(shí)運(yùn)行,并且只有完成該階段后,才能開(kāi)始下一次 STW 年輕代垃圾回收。
? ? ? ? ? ? ? ? 并發(fā)標(biāo)記(Concurrent Marking)G1 GC 在整個(gè)堆中查找可訪問(wèn)的(存活的)對(duì)象。該階段與應(yīng)用程序同時(shí)運(yùn)行,可以被 STW 年輕代垃圾回收中斷
? ? ? ? ? ? ? ? 最終標(biāo)記(Remark,STW)該階段是 STW 回收,幫助完成標(biāo)記周期。G1 GC 清空 SATB 緩沖區(qū),跟蹤未被訪問(wèn)的存活對(duì)象,并執(zhí)行引用處理。
? ? ? ? ? ? ? ? 清除垃圾(Cleanup,STW)在這個(gè)最后階段,G1 GC 執(zhí)行統(tǒng)計(jì)和 RSet 凈化的 STW 操作。在統(tǒng)計(jì)期間,G1 GC 會(huì)識(shí)別完全空閑的區(qū)域和可供進(jìn)行混合垃圾回收的區(qū)域。清理階段在將空白區(qū)域重置并返回到空閑列表時(shí)為部分并發(fā)。

? ? ? ? 以上是原理,我的問(wèn)題和cms的Stringtable問(wèn)題,可能相似,發(fā)生一次mix gc 是不是會(huì)清理掉,yonggc清理不掉的垃圾呢?
那怎們?cè)O(shè)置呢?還記得-XX:InitiatingHeapOccupancyPercent參數(shù)嗎?就是干這個(gè)用的,我能接受的yonggc tp對(duì)應(yīng)的當(dāng)時(shí)場(chǎng)景的old heap是1g左右,那么-XX:InitiatingHeapOccupancyPercent=1g/8g 大概等于12% 那這個(gè)值就改成12試試~
持續(xù)觀察,未完待續(xù)~~~
02-05監(jiān)控圖有點(diǎn)奇怪:


image.png

02-07監(jiān)控越來(lái)越惡略:


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

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

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