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

本文通过JMeter对Tomcat施加压力,调整JavaOpts中的垃圾回收器参数,研究其对性能的影响。实验结果显示,增大堆大小、设置初始堆、使用ParallelOldGC等策略能显著提升吞吐量,减少Full GC次数,优化Tomcat性能。
摘要由CSDN通过智能技术生成

目的

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

环境

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

配置Jmeter配置线程数

14a5946c07e16a24c724b8cbc5ed1a32.png

10 个线程循环 1000 次

配置 HTTP 请求

13a34bd9fbf4a70e3bd4ae013e9ef8e0.png

配置观察结果

524fa195888b2554e1fe1f3b014a1142.png

配置聚合报告

a1a5f7c19689b29ae2f787b8d45473b0.png

吞吐量,一秒钟 141.2 个请求

配置 Tomcat

初试串行回收器

在 tomcat 的 catalina.sh 添加

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

tomcat 日志

75461706e2b4950cdd092ff990feceec.png

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

1

2

3

4

5

6Java 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 运行结果

737b3809c8964be3aab5c86f3694c278.png

JMeter运行过程中GC日志

4f8a91fdc76fcd733f65e4044ac89851.png

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

扩大堆提升性能

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

在 tomcat 的 catalina.sh 添加

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

JMeter 运行结果

28e46723aff23d5a494b74b5cb2ff271.png

GC 日志

e8c856aa7407f0a2d427d82cbefdd85b.png

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

增加初始堆提升性能

6a34498a09bbf68389fda5a66cb69271.png

上面不加初始堆的情况下,可见堆空间维持在 200M 样子,所以设置初始的堆大小 200M,有利于减少 GC 次数

在 tomcat 的 catalina.sh 添加

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

JMeter 运行结果

ea00a9e9af7875e5b582e70e1f53c4fd.png

GC 日志

b42af6067efa446dfdb04ede72908822.png

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

使用 ParrelOldGC 回收器

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

在 tomcat 的 catalina.sh 添加

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

JMeter 运行结果

559ef8d9d2550180c6453764f096425c.png

GC 日志

bb9453830742a009437c9244e7e4d406.png

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

使用较小的堆提高 GC 压力

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

在 tomcat 的 catalina.sh 添加

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

JMeter 运行结果

aa94d8acbc37a38d62df86b7cff3f12a.png

GC 日志

99c58bc9a5412859b25ef0a63d9c7894.png

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

使用ParallelOldGC回收器

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

在 tomcat 的 catalina.sh 添加

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

JMeter 运行结果

ec7b77857d0097b26a59908a75ac37cc.png

GC 日志

61ddcec2c64e50f00c601dba87a3568e.png

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

测试 ParNew 回收器

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

在 tomcat 的 catalina.sh 添加

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

JMeter 运行结果

f36deaa4a689c7eb2630981bf529cb21.png

GC 日志

4f2e1847d3536ff0a88c7bf1981ffa2f.png

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

提高虚拟机版本

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

在 tomcat 的 catalina.sh 添加

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

JMeter 运行结果

8daa1bb9de6a03a78c2c46d61eaa40a7.png

GC 日志

38689c1dac189a13d57aab6b2a53229d.png

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

提高性能方法使用新生代、老年代并行回收器 ParrellOldGC 替代串行回收器

扩大初始堆和堆空间大小减少 GC 次数

提高虚拟机版本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值