【JVM】第五章_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
我们发现性能又有所提升