JVM Tomcat性能实战(推荐)
本节只是介绍实战部分,具体的理论参数,请自行百度。
所需工具:linux服务器 jmeter测试工具 xshell 一个web应用
tomcat的jvm参数可以配置在catalina.sh,如果是在window上可以配置.bat文件
配置1:
这里 我配置了一个gc日志路径为/home/log/gc.log ,打印gc的日志,初始堆和最大堆内存设置为50m,输出dump文件在内存溢出的时候 ,使用串行垃圾收集器,永久代大小为50m。
将web应用放到对应的目录,配置好server.xml(这里不作配置介绍),sh start.sh启动tomcat.
使用压测工具(jmeter)进行吞吐量的测试。没用过的同学可以上官网下载学习一下http://jmeter.apache.org/
建立用户组(10个线程,每个线程请求1000次),设置好http请求的信息,生成一个聚合报告和一个gc日志
先来看一下gc日志吧:
满屏幕的full gc啊,最后查看聚合报告:
吞吐量维持在122.7每秒。从这个案例中我们可以看到老年代34176k基本已经满了,经过fullgc之后新生代会有一点剩余的空间。总的来说full gc的停顿时间是最长的,而且发生的这么频繁,显然这样的配置是不合理的。
配置2:
这次配置主要是增大了最大堆内存。以便虚拟机自动扩容,得到稳定的堆内存大小。
只需要关注一点 最大堆内存为82924k 80m左右,也就是说虚拟机对堆内存自动扩容到80m,并且稳定下来。这个配置测试只是为了找到一个稳定的堆内存,以便接下来的测试。
配置三:
设置堆的初始内存128m。
由配置2的结果可知,堆内存最终稳定在80m左右,因此小于80m的堆内存,很有可能会引起大量的gc反应,所以这里我把堆内存设置为128m,可以减少gc次数。
可以看到吞吐量略微有所提升,gc次数大量减少,并且gc的时间间隔变得更长。
配置四:
当前使用parallalgc回收器,这是一个多线程并行回收器。
使用多线程并行的gc回收器吞吐量有略微有提升。(在没有gc压力的情况下,parallalgc和serialgc对吞吐量影响不大。)
配置五:
配置六:
根据配置三的结论在80m以下的堆内存会发生频繁的gc,再结合配置四中得到的结论在有一定gc压力的时候,parallelgc和serialgc的吞吐量会表现出一定的差异性。配置五和配置六的堆内存64m<80m ,会发生频繁的gc,采用不同的gc回收器的时候,理论上会在在吞吐量上有较大的差异性,但是我的实验为什么差距不是很大,到底为什么呢? 诶, 家里穷,我用的是单核的cpu,在单核的情况下parallelgc改变性能并不明显。在单核或者并行能力较弱的情况下还是推荐使用serialgc。有条件的同学可以用多核的服务器试一下哦!
配置七:
用parnewgc试试,新生代使用parnewgc回收,老年代依旧使用serialgc回收。看看性能如何?
比全部使用串行回收器的性能好,但是比全部使用并行回收器的性能差些。
另外jdk版本的升级可能也会使得性能有一点的提升,但是jdk版本升级伴随着一定的风险,也许在新版本的jdk中引入某些未知的bug.
最后我列出一些常用的jvm配置参数供参考:
1. 与串行回收期相关的参数
•-xx:+useserialgc:在新生代和老年代使用串行的收集器
•-xx:survivorratio:设置eden区的大小和survivor区的比例
•-xx:pretenuresizethreshold:设置大对象直接进入老年代的阀值。当对象的大小超过这个值,将直接在老年代分配
•-xx:maxtenuringthreshold:设置对象进入老年代的年龄的最大值。每一次minor gc后,对象年龄就加1.任何大于这个年龄的对象,一定会进入老年代。
2. 与并行gc相关的参数
•-xx:+useparnewgc:在新生代使用并行收集器。
•-xx:+useparalleloldgc:在老年代使用并行收集器
•-xx:+parallelgcthreads:设置用于垃圾回收的线程数,通常可以设置成和cpu数相等。cpu数量较多的情况下,设置相对小的数值也可。
•-xx:+maxgcpausemillis:设置最大垃圾收集停顿时间。它的值是一个大于0的整数。收集器在工作时,会调整java堆的大小或其他的一些参数,尽可能把停顿时间控制在maxgcpausemillis以内。
•-xx:+useadaptivesizepolicy:打开自适应gc策略,在这种模式下,新生代的大小和survivior的比例,晋升老年代的对象年龄等参数会被自动的调整,以达到堆大小,吞吐量和停顿之间的平衡点。
•-xx:+gctimeratio:设置吞吐量大小。它的值是一个0到100之间的证书。假设gctimeratio的值为n,那么系统将花费不超过1/(1+n)的时间用于垃圾收集。
3. 与cms收集器相关的参数
•-xx:+useconcmarksweepgc:新生代使用并行收集器,老年代使用cms+串行收集器。
•-xx:parallelcmsthreads:设置cms的线程数量。
•-xx:cmsinitiatingoccupancyfraction:设置cms收集器在老年代空间被使用多少后触发,默认68%
•-xx:usecmscompactatfullcollection:设置cms在完成垃圾收集后是否要进行一次碎片整理
•-xx:cmsfullgcbeforecompaction:设定进行多少次cms垃圾回收后,进行一次内存压缩。
•-xx:+cmsclassunloadingenabled:允许对类元数据进行回收
•-xx:cmsinitiatingpermoccupancyfraction:当永久代占有率达到这一百分比时,启动cms回收(前提是-xx:+cmsclassunloadingenabled被激活了)
•-xx:usecmsinitiatingoccupancyonly:表示只有在到达阀值的时候才进行cms回收。
•-xx:+cmsincrementalmode:使用增量模式,比较适合单cpu.增量模式在中标记为废弃,jdk9中将彻底移除
4. 与g1回收期相关的参数
•-xx:+useg1gc:使用g1回收器
•-xx:+maxgcpausemillis:设置最大的垃圾收集停顿时间
•-xx:+gcpauseintervalmillis:设置停顿时间间隔。
5. tlab相关
•-xx:+usetlab:开启tlab分配。
•-xx:+printtlab:打印tlab相关分配信息
•-xx:tlabsize:设置tlab大小
•-xx:+resizetlab:自动调整tlab大小
6. 其他一些参数
•-xx:+disableexplicitgc:禁用显式gc
•-xx:+explicitgcinvokesconcurrent:使用并发方式处理显式gc
以上这篇jvm tomcat性能实战(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
推荐阅读
-
JVM Tomcat性能实战(推荐)
-
JVM Tomcat性能实战(推荐)
-
(转载)JVM参数对J2EE性能优化的影响 博客分类: jvm JVMCMS应用服务器多线程Tomcat
-
(转载)JVM参数对J2EE性能优化的影响 博客分类: jvm JVMCMS应用服务器多线程Tomcat
-
JVM性能调优实战:让你的IntelliJ Idea纵享丝滑
-
jvm参数实战:VisualVM工具对Eclipse性能调优
-
JVM实战-06·Tomcat如何设置JVM参数
-
JVM性能调优监控工具专题二:VisualVM基本篇之远程监控,监控Tomcat
-
京东T8架构师墙裂推荐:史上最全高性能MySQL实战(赶紧收藏)
-
一线架构师开发总结:剖析并发编程+JVM性能,深入Tomcat与MySQL