jvm 工具篇-(3)-G1-案例-調優過程

1.啟動參數:

-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

參數含義見:jvm-G1

2.運行5天+

image.png

3.剛啟動時監控:

 平均在50ms
image.png

4.5天后監控:

平均在150ms,還在上漲


image.png

5.問題已經很明顯了

就是隨著使用的時長延續,導致yonggc tp拉高,我的應用是每天拉高10~20ms左右,這個對于提供webServcie服務也是不能接受的。

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

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

? ? ? ? 以上是原理,我的問題和cms的Stringtable問題,可能相似,發生一次mix gc 是不是會清理掉,yonggc清理不掉的垃圾呢?
那怎們設置呢?還記得-XX:InitiatingHeapOccupancyPercent參數嗎?就是干這個用的,我能接受的yonggc tp對應的當時場景的old heap是1g左右,那么-XX:InitiatingHeapOccupancyPercent=1g/8g 大概等于12% 那這個值就改成12試試~
持續觀察,未完待續~~~
02-05監控圖有點奇怪:


image.png

02-07監控越來越惡略:


image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容