【JVM】第五章_2 性能调优实战

GC的性能怎么样,我们得有数据才能进行分析。同时还得有分析的步骤。

第一步要得到GC的日志,第二步进行分析,第三步进行小步调优对比分析

开始之前先说介绍一下两款可视化的分析工具,有了工具就可以事半功倍。

1、在线工具:http://gceasy.io/

2、GCViewer

https://github.com/chewiebug/GCViewer

mvn clean package -Dmaven.test.skip

【JVM】第五章_2 性能调优实战

双击打开它就可以了。

 

一、得到GC日志

1)相关参数

【JVM】第五章_2 性能调优实战

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行左右

【JVM】第五章_2 性能调优实战

在这行之前我们设置:

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日志分析

【JVM】第五章_2 性能调优实战

把我们的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:关键指标

【JVM】第五章_2 性能调优实战

吞吐量:95.83

平均停顿时间:68ms

最大停顿时间:210ms

 

3)GC Statistics:GC的统计

【JVM】第五章_2 性能调优实战

共16次GC,其中14次youngGC,2次FullGC

 

4)GC Causes: 引发GC的原因分析

【JVM】第五章_2 性能调优实战

 

 

三、进行调优_parallelGC

 

【JVM】第五章_2 性能调优实战

前面章节讲过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 效果不是很好。那一起用效果怎么样?

【JVM】第五章_2 性能调优实战

发现效果也比较一般,还不如单独设置MetaspaceSize

3)总结:

【JVM】第五章_2 性能调优实战

四、进行调优_G1

【JVM】第五章_2 性能调优实战

 

方案

吞吐量

最大

平均

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)初始情况下

发现性能还很好,吞吐量和响应时间都很好。也没有优化建议。

【JVM】第五章_2 性能调优实战

 

发现有一次metadata GC 可以做一次小优化吧。

2)设置MetaspaceSize

【JVM】第五章_2 性能调优实战

效果对比一下发现,吞吐量提升了一些。但平均响应时间大了一点。minor GC提升的很大。优化还是比较成功的。

【JVM】第五章_2 性能调优实战

3)设置最大停顿时间和吞量

-XX:+UseG1GC -XX:MetaspaceSize=64M -XX:GCTimeRatio=99

 

【JVM】第五章_2 性能调优实战

我们发现性能又有所提升