GC調優實戰
1.怎麼調優
調優的一般步驟:①首先收集gc日誌,②分析日誌中的關鍵效能指標,③分析GC原因,調優JVM引數。
衡量GC的兩個指標:①吞吐量 ②響應時間。理想情況下是高吞吐量,低響應時間,但現實往往兩個引數是相悖的。
高吞吐量適合場景:科學計算,後臺處理等弱互動場景。
高響應時間適合場景:對響應時間有要求的場景。
GC分析工具:
①gceasy,線上使用。
2.G1垃圾回收器
1.1 初始引數設定
PARALLEL_OPTION="-xx:+UseParallelGC -XX:+UseParalleloldGC -XX:MaxGCPauseMills=100 -XX:GCTimeRatio=99 -XX:YoungGenerationSizeIncrement=30" CMS_OPTION="-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=92 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5" G1_OPTION="-xx:+UseG1GC -Xms128M -Xmx128 -XX:MetaspaceSize=64M -XX:MaxGCPauseMillis=100 -XX:+UseStringDeduplication -XX:StringDeduplicationAgeThreshold=3" JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_HOME/logs/ -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -Xloggc:$CATALINA_HOME/logs/gc.log -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution" |
2.2 垃圾回收結果:
我們可以看到吞吐量99.76, 最小停頓時間0.00004s,最大停頓時間0.03549s,平均停頓時間0.0007s,GC13次
我們要做的事情:調整Metadata,tenured heap21M,
修改JAVA_OPTS:
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MetaspaceSize=50M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_HOME/logs/ -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -Xloggc:$CATALINA_HOME/logs/gc.log -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution" |
(2)第二次:
我們可以看到吞吐量99.8, 最小停頓時間0.00004s,最大停頓時間0.03446s,平均停頓時間0.00049s,GC7次
(3)這次我們調整初始堆大小
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MetaspaceSize=50M -Xms128M -Xms128M -XX:MaxGCPauseMillis=100 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_HOME/logs/ -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -Xloggc:$CATALINA_HOME/logs/gc.log -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution" |
我們可以看到吞吐量99.74, 最小停頓時間0.00003s,最大停頓時間0.02183s,平均停頓時間0.00055s,GC10次。