转载

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

通过 JMeter 对 Tomcat 增加压力,调整虚拟机参数达到调优效果,增加吞吐量

环境

tomcat7,jdk7,jmeter3.1,一个web网站

配置Jmeter

  • 配置线程数

    【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

    10 个线程循环 1000 次

  • 配置 HTTP 请求

    【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响
  • 配置观察结果

    【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响
  • 配置聚合报告

    【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

    吞吐量,一秒钟 141.2 个请求

配置 Tomcat

初试串行回收器

在 tomcat 的 catalina.sh 添加

JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx100M -Xms32M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseSerialGC"

tomcat 日志

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

限制堆初始32M,最大 100M,GC 初始日志

Java HotSpot(TM) 64-Bit Server VM (25.0-b70) for bsd-amd64 JRE (1.8.0-b132), built on Mar 4 2014 03:11:43 by "java_re" with gcc 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
Memory: 4k page, physical 8388608k(288540k free)

/proc/meminfo:

CommandLine flags: -XX:+HeapDumpOnOutOfMemoryError -XX:InitialHeapSize=33554432 -XX:MaxHeapSize=104857600 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseSerialGC

Jmeter 运行结果

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

JMeter运行过程中GC日志

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

结果吞吐量 57,在 JMeter 运行过程中不断发生 FULL GC 并且消耗的时间还挺长的,严重影响了应用程序的吞吐量

扩大堆提升性能

把原来的 100M 堆,扩大到 512M

在 tomcat 的 catalina.sh 添加

JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx512M -XX:+HeapDumpOnOutOfMemoryError "

JMeter 运行结果

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

GC 日志

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

可以看出吞吐量319,性能增加了好几倍,其中 FULL GC 明显减少,大大提高了应用程序的性能

增加初始堆提升性能

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响 上面不加初始堆的情况下,可见堆空间维持在 200M 样子,所以设置初始的堆大小 200M,有利于减少 GC 次数

在 tomcat 的 catalina.sh 添加

JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx512M -Xms200M -XX:+HeapDumpOnOutOfMemoryError "

JMeter 运行结果

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

GC 日志

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

可以看到减少了 GC 次数,应用程序的吞吐量达到了450次/秒

使用 ParrelOldGC 回收器

前面用的串行回收器,这次换一个并行的回收器,线程数为 4

在 tomcat 的 catalina.sh 添加

JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx512M -Xms200M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:ParallelGCThreads=4"

JMeter 运行结果

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

GC 日志

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

由于 GC 压力并不大,所以改成并行回收器,吞吐量并没有改善

使用较小的堆提高 GC 压力

减少堆空间大小,看下串行回收器的效果

在 tomcat 的 catalina.sh 添加

JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx100M -Xms100M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseSerialGC"

JMeter 运行结果

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

GC 日志

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

可见串行的回收器大量的 GC 日志,吞吐量大量减少,吞吐量 74

使用ParallelOldGC回收器

和上面同样的方案,只是换用并行的回收器,看下效果(ParallelGCThreads=4 本机是 4 核的)

在 tomcat 的 catalina.sh 添加

JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx100M -Xms100M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelOldGC -XX:ParallelGCThreads=4"

JMeter 运行结果

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

GC 日志

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

可见并行回收器的 GC 日志大量减少,吞吐量相比串行提升了一倍

测试 ParNew 回收器

使用 ParNew回收器代替ParallelOldGC,这样老年代依然串行,新生代并行

在 tomcat 的 catalina.sh 添加

JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx100M -Xms100M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC"

JMeter 运行结果

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

GC 日志

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

吞吐量73 比新生代、老年代都串行的要高一点

提高虚拟机版本

使用 JDK11 代替原来的 JDK7,参数和上面的一致

在 tomcat 的 catalina.sh 添加

JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx100M -Xms100M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC"

JMeter 运行结果

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

GC 日志

【深入浅出-JVM】(39):实战垃圾回收对 Tomcat 性能影响

吞吐量75 比上面的要高一点,可见简单的升级虚拟机版本也可以得到性能的提升

原文  http://mousycoder.com/thinking-in-jvm/39/
正文到此结束
Loading...