第五章_2 性能调优实战
GC的性能怎么样,我们得有数据才能进行分析。同时还得有分析的步骤。
第一步要得到GC的日志,第二步进行分析,第三步进行小步调优对比分析
开始之前先说介绍一下两款可视化的分析工具,有了工具就可以事半功倍。
1、在线工具:http://gceasy.io/
2、GCViewer
https://github.com/chewiebug/GCViewer
mvn clean package -Dmaven.test.skip
双击打开它就可以了。
一、得到GC日志
1)相关参数
GC的日志是默认关闭的,需要我们手动的打开才能得到
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.log
https://jingyan.baidu.com/article/3ea51489c045d852e61bbaab.html
2)参数设置
打开我们的tomcat/bin/catalina.sh文件找到250行左右
在这行之前我们设置:
PRRINT_GC="-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.log"
JAVA_OPTS="$JAVA_OPTS $PRRINT_GC"
然后启动tomcat容器。我们可以看到tomcat/logs/目录下面出现了gc.log文件
3)打开gc.log认识一下GC的日志格式:
Java HotSpot(TM) 64-Bit Server VM (25.172-b11) for bsd-amd64 JRE (1.8.0_172-b11), built on Mar 28 2018 15:38:02 by "java_re" with gcc 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
Memory: 4k page, physical 8388608k(730696k free)
/proc/meminfo:
CommandLine flags: -XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2147483648 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
2018-11-06T10:49:34.658-0800: 1.452: [GC (Allocation Failure) [PSYoungGen: 33280K->5107K(38400K)] 33280K->7147K(125952K), 0.0138792 secs] [Times: user=0.04 sys=0.00, real=0.02 secs]
-11-06T10:49:39.583-0800: 6.377: [Full GC (Metadata GC Threshold) [PSYoungGen: 12768K->0K(285184K)] [ParOldGen: 37551K->22553K(75264K)] 50320K->22553K(360448K), [Metaspace: 20798K->20798K(1069056K)], 0.0564536 secs] [Times: user=0.14 sys=0.00, real=0.06 secs]
二、使用工具进行GC日志分析
把我们的gc.log上传上去就会得到一个报告。分析一下这个报告:
1)Tips to reduce GC Time 这是一个可优化的建议
7.41% of GC time (i.e 80 ms) is caused by 'Metadata GC Threshold'. This GC is triggered when metaspace got filled up and JVM wants to create new objects in this space..
Solution:
If this GC repeatedly happens, increase the metaspace size in your application with the command line option '-XX:MetaspaceSize'.
上面建议metadata 可以进行优化建议设置-XX:MetaspaceSize
2)Key Performance Indicators:关键指标
吞吐量:95.83
平均停顿时间:68ms
最大停顿时间:210ms
3)GC Statistics:GC的统计
共16次GC,其中14次youngGC,2次FullGC
4)GC Causes: 引发GC的原因分析
三、进行调优_parallelGC
前面章节讲过Parallel GC是一个自适应的GC,它可以动态的调整内存大小。
parallel GC是一个吞吐量优先的垃圾收集器。所以我们可以只设置一下吞吐量的目标,其它的让GC自适应就好。
优化效果对比分析:
方案 | 吞吐量 | 最大 | 平均 | YGC | FullGC |
初始 | 95.832% | 210 ms | 68 ms | 14 | 2 |
-XX:MetaspaceSize=64M | 98.054% | 50 ms | 36 ms | 8 | 0 |
吞吐量和最大响应时间 | 97.365% | 100 ms | 35 ms | 10 | 1 |
一起调 | 97.293% | 50 ms | 29 ms | 8 | 0 |
初始 | 95.525% | 290 ms | 72 ms | 16 | 3 |
-XX:MetaspaceSize=64M | 95.186% | 280 ms | 69 ms | 13 | 2 |
-XX:MetaspaceSize=96M | 96.195% | 180 ms | 48 ms | 11 | 1 |
吞吐量和最大响应时间 | 97.358% | 50 ms | 26 ms | 8 | 0 |
1)设置-XX:MetaspaceSize=64M
PRRINT_GC="-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.log"
PARALLEL="-XX:MetaspaceSize=64M"
JAVA_OPTS="$JAVA_OPTS $PARALLEL $PRRINT_GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_HOME/logs/"
2)设置吞吐量和最大响应时间目标
-XX:MaxGCPauseMillis=100 -XX:GCTimeRatio=99
发现没有设置MetaspaceSize 效果不是很好。那一起用效果怎么样?
发现效果也比较一般,还不如单独设置MetaspaceSize
3)总结:
四、进行调优_G1
方案 | 吞吐量 | 最大 | 平均 | minor GC | mark | FullGC |
初始 | 96.552% | 40 ms | 14 ms | 80 | 5 | 7 |
-XX:MetaspaceSize=64M | 97.575% | 30 ms | 21 ms | 9 | 0 | 0 |
吞吐量和MetaspaceSize | 98.914% | 40 ms | 25 ms | 6 | 0 | 0 |
初始 | 96.071% | 40 ms | 16 ms | 40 | 4 | 4 |
-XX:MetaspaceSize=64M | 97.636% | 40 | 21 | 15 | 0 | 0 |
吞吐量和MetaspaceSize | 98.547% | 90 ms | 37 ms | 7 | 0 | 0 |
最大响应时间 | 97.244% | 50 ms | 26 ms | 12 |
1)初始情况下
发现性能还很好,吞吐量和响应时间都很好。也没有优化建议。
发现有一次metadata GC 可以做一次小优化吧。
2)设置MetaspaceSize
效果对比一下发现,吞吐量提升了一些。但平均响应时间大了一点。minor GC提升的很大。优化还是比较成功的。
3)设置最大停顿时间和吞量
-XX:+UseG1GC -XX:MetaspaceSize=64M -XX:GCTimeRatio=99
我们发现性能又有所提升