【0036】浅析Tomcat调优

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

前言

Tomcat是业界使用最广的一个Web服务器,懂得一些调优会对Tomcat的性能有很大提升,本文就是介绍一些调优策略,在实战中体验一下调优带来的好处。


本文大纲:

       1、前期准备

       2、调优前压力测试

       3、调优后压力测试

       4、总结




一、调优前期准备

内存监控工具:JDK自带的Visual VM

压力测试工具:JMeter3.0


二、调优前压力测试

调优前使用的是默认配置,跑的是一个J2EE项目,如下:

Tomcat版本:6.0

JDK版本:1.7

垃圾收集器:Parallel Scavenge(新生代) & Parallel Old(老年代)

内存分配:

新生代:Eden 336M  Survivor 112M

老年代:674.5M

永久代:82M

Tomcat启动时间:6.3s

垃圾收集时间:YGC 8次 约100ms  平均12.5ms/次  FGC 0次


【0036】浅析Tomcat调优


使用JMeter做压力测试,500个线程,循环10次。测试结果如下:

YGC 20.7ms/次   FGC  0.332s/次

【0036】浅析Tomcat调优


500个线程,循环20次。测试结果如下:

YGC 22.08ms/次   FGC  0.482s/次

【0036】浅析Tomcat调优


三、调优后压力测试


对调优前的分析:

1、新生代、老年代和永久代设置的内存最大值和初始值不是一样的,会导致扩容时增加GC停顿时间。


2、新生代GC次数较多,原因是初始化内存值太小,扩容引起的GC


3、老年代GC次数为一次,即使是一次,也是无谓的,也是扩容引起的。

       

对于以上分析,做出的重新配置为:

-server  

-Xms512M

-Xmx512M

-Xmn128M

-XX:PermSize=256M

-XX:MaxPermSize=256M

-XX:+DisableExplicitGC

-XX:+UseParNewGC

-XX:+UseConcMarkSweepGC

-XX:+CMSScavengeBeforeRemark

-XX:CMSInitiatingOccupancyFraction=85


解释一下各个参数的含义:

-server是以server模式运行虚拟机。


-Xms512M设置堆最小内存为512M-Xmx512M设置堆最大内存为512M,这两个参数设置一样可以防止内存不足扩容引起的GC,减少停顿时间。


-Xmn128M设置新生代的内存为128M,一般设置为整一个堆的1/4,,可以根据实际情况调整。


-XX:PermSize=256M设置永久代初始化内存为256M-XX:MaxPermSize=256M设置永久代的最大内存为256M,设置这两个参数一样也是为了防止内存不足扩容引起的GC,减少停顿时间。


-XX:+DisableExplicitGC禁用代码层面的gc,如System.gc(),让垃圾收集器自动收集内存。


-XX:+UseParNewGC使用ParNew收集器。


-XX:+UseConcMarkSweepGC使用CMS并发收集器,一般与ParNew搭配更佳。


-XX:+CMSScavengeBeforeRemark设置CMS发生GC时先进行一次YGC,可以减少GC停顿时间。


-XX:CMSInitiatingOccupancyFraction=85设置CMS垃圾收集器的预留内存阀值为85%,因为CMS是一个并发的垃圾收集器,在回收内存时用户线程还在运行,所以需要预留一部分内存。

 

调优后:

Tomcat版本:6.0

JDK版本:1.7

垃圾收集器:ParNew(新生代) & CMS(老年代)

内存分配:

新生代:Eden128M  Survivor 12M

老年代:384M 

永久代:256M

 

重新启动Tomcat,启动时间下降至6.2sYGC次数有之前的8次下降到2次,耗时大概减少20ms

【0036】浅析Tomcat调优


使用JMeter做压力测试,500个线程,循环10次。测试结果如下:

YGC 19.3ms/   FGC  0次。与未调优对比,没有发生FGCYGC停顿的时间也更短,每次的YGC时间相对减少1.5ms

【0036】浅析Tomcat调优


500个线程,循环20次。测试结果如下:

YGC16.86ms/  FGC  0次。与未调优对比,没有发生FGCYGC停顿的时间也更短,每次的YGC时间相对减少5.2ms

【0036】浅析Tomcat调优


对比调优前后可知,随着服务器的访问压力越来越大的情况下,未调优时的YGC时间是不断增大的,而调优后的YGC时间是不断减少的。


四、总结

对于Tomcat的调优,可以是多方面的,本文主要从JVM层面进行调优。这是一篇入门级的调优,但相信你已经知道如何调优了。注意一点:你务必要在监控的情况下进行调优!

始发于微信公众号: Java框架源码分析