天天看點

java虛拟機(十三)--GC調優

  GC調優對我們開發人員來說,如果你想要技術方面一直發展下去,這部分内容的了解是必不可少的,jvm對于工作、面試來說都很重要,GC調優的問題

更是重中之重,因為是對你jvm學習内容的實踐,知識隻有應用實踐出來才有意義,否則知識紙上談兵。

首先,我們需要了解的内容,包括:

1、jvm記憶體結構:java虛拟(一)--java記憶體區域和常量池概念

2、垃圾收集算法:java虛拟機(五)--垃圾回收機制GC

3、常見的垃圾收集器:java虛拟機(六)--垃圾收集器和記憶體配置設定政策

4、GC日志分析:java虛拟機(十一)--GC日志分析    java虛拟機(十二)--可視化工具分析GC日志

5、jvm常見參數:java虛拟機(九)--常用jvm參數

PS:本文GC調優非生産環境,隻是個人Linux系統對一個簡單項目的啟動調優,通過GC日志調整相關參數,學習GC調優的方法,最終在生産環境得到應用

網上有很多生産環境GC調優的案例,請自行參考

垃圾回收器的主要衡量标準:

1、吞吐量

2、最大停頓時間

GC調優步驟:

1、列印GC日志

2、根據日志獲得關鍵性能名額

3、分析GC原因,調優JVM參數

Parallel GC調優:

官網建議:

1、除非确定,否則不要設定最大堆記憶體

2、優先設定吞吐量目标

3、如果吞吐量目标達不到,調大最大記憶體,不能讓OS使用Swap,如果任然達不到,降低目标

4、如果吞吐量能達到,GC時間太長,設定停頓時間的目标

首先設定參數:

JAVA_OPTS="-XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_HOME/logs/ -XX:+PrintGCDetails
 -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.log"      

-XX:+DisableExplicitGC:是指禁止代碼中通過system.gc()主動調用GC

将生成的GC日志通過GCeasy分析,首先看到吞吐量為93.78%

java虛拟機(十三)--GC調優

發生12GC,2次Full GC,10次Minor GC,Minor GC和Full GC的時間如下:

java虛拟機(十三)--GC調優

GC發生的原因:

java虛拟機(十三)--GC調優

其中Ergonomics導緻一次Full GC,耗時為130ms,時間最長

Metadata GC Threshold導緻發生1次Full GC,一次Minor GC

Allocation Failure和GCLocker Initiated GC導緻9次Minor GC

java虛拟機(十三)--GC調優

調優步驟如下:調優就是實驗的過程

其中Ergonomics為jvm的自适應,根據CPU和記憶體情況自行調節jvm記憶體結構,但是也導緻了一次Full GC

官方建議:除非很确定,否則不要設定最大堆記憶體,是以這裡不調節堆記憶體

1、因為Metaspace GC Thread出現Full GC,是以這裡選擇調節-XX:MetaspaceSize=64M,因為最大使用了22.74M

java虛拟機(十三)--GC調優

吞吐量有了提高,GC次數降低,最大GC Pause為70ms,是以我們對于MetaspaceSize的調節是對的

2、對于一個測試項目來說,我們隻是測試啟動GC,95.94%的吞吐量,不夠高,是以這裡測試一下:

 -XX:MaxGCPauseMillis=100 -XX:GCTimeRatio=99,最大GC時間位100ms,吞吐量為99%

java虛拟機(十三)--GC調優

發現為了提高吞吐量,吞吐量有了小幅度提升,但是GC時間卻增長了很多

11次GC中有10次Minor GC,原因都是Allocation Failure

java虛拟機(十三)--GC調優

3、我們選擇記憶體動态擴容增量參數,調節為30,我們查詢直到,預設為20%

# jinfo -flag YoungGenerationSizeIncrement 25436
-XX:YoungGenerationSizeIncrement=20      

 調節發現,吞吐量為94.346%,是以這裡這個參數不太适合

是以GC調優就是不斷試驗的過程,調優的次數多了,就有了經驗,還有其他很多參數,都可以試驗測試,檢視起到的作用

PS:我這裡測試的參數可能和你的項目以及環境不同,起到的作用可能不同,例如動态擴容參數,換個項目可能就會有好的作用

G1調優:jdk1.8一般采用G1

官網建議:

1、年輕代大小:

  避免使用-Xmn、-XX:NewRatio等顯式設定Young區大小,會覆寫暫定時間目标

2、暫停時間目标:

  暫停時間不要太苛刻,吞吐量目标為90%,太嚴苛影響吞吐量

3、關于Mixed GC調優參數:

-XX:InitiatingHeapOccupancyPercent:

  堆占有率達到這個數值則觸發global concurrent marking,預設45%

-XX:G1HeapWastePercent:

  在global concurrent marking結束之後,可以知道區中有多少空間要被回收,在每次YGC之後和再次發生Mixed GC之前,會檢查垃圾占比是

否達到這個參數,如果達到了,下次才會發生Mixed GC。

-XX:G1MixedGCLiveThresholdPercent:

  Old區Region被回收的時候,存貨對象的占比

-XX:G1MixedGCCountTarget:

-XX:G1OldSetRegionThresholdPercent:

調優步驟如下:

1、預設情況下

java虛拟機(十三)--GC調優
java虛拟機(十三)--GC調優
java虛拟機(十三)--GC調優
java虛拟機(十三)--GC調優
When you see to-space overflow or to-space exhausted messages in your logs, the G1 GC does not have enough memory for either survivor or promoted objects, or for both. The Java heap cannot because it is already at its maximum. Example messages:

924.897: [GC pause (G1 Evacuation Pause) (mixed) (to-space exhausted), 0.1957310 secs]

924.897: [GC pause (G1 Evacuation Pause) (mixed) (to-space overflow), 0.1957310 secs]

To alleviate the problem, try the following adjustments:

Increase the value of the -XX:G1ReservePercent option (and the total heap accordingly) to increase the amount of reserve memory for "to-space".

Start the marking cycle earlier by reducing the value of -XX:InitiatingHeapOccupancyPercent.

Increase the value of the -XX:ConcGCThreads option to increase the number of parallel marking threads.      

 上面是官方建議:

  對于Mixed GC,可以增加

-XX:G1ReservePercent

選項的值(以及相應的總堆)以增加“to-space”的保留記憶體量

 總共測試四次,如下表格:

java虛拟機(十三)--GC調優

  最後修改的參數:-XX:GCTimeRatio=100,理論上對于G1垃圾收集器應該是很重要的,因為本身就是強調吞吐量,隻是本次測試隻是小的測試項目,

而且伺服器配置比較渣,隻有2個CPU,有些參數無法試驗

總結:

  我們可以通過官方文檔的建議,通過GC日志,結合解析工具,無論是GCeasy還是GC View都是可以的,通過發生GC的原因等問題逐漸調節參數,

官方文檔一定要多看幾遍,我隻是簡單浏覽而已,後面肯定會仔細看的。

GC調優指南:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html

如何選擇垃圾收集器:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html

G1最佳實踐:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc_tuning.html#recommendations

G1 GC的一些關鍵技術:https://zhuanlan.zhihu.com/p/22591838

轉載于:https://www.cnblogs.com/huigelaile/p/11184403.html