1.怎么调优
调优的一般步骤:①首先收集gc日志,②分析日志中的关键性能指标,③分析GC原因,调优JVM参数。
衡量GC的两个指标:①吞吐量 ②响应时间。理想情况下是高吞吐量,低响应时间,但现实往往两个参数是相悖的。
高吞吐量适合场景:科学计算,后台处理等弱交互场景。
高响应时间适合场景:对响应时间有要求的场景。
GC分析工具:
①gceasy,在线使用。
②GCViewer,本文使用它进行分析调优(下载地址:https://download.csdn.net/download/u014172271/10624430)。
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次。