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啊,而且观察第一列时间戳变化结合用时可以发现,几乎上一次Full GC还没有结束,下一次又来了,真是一波还未平息,一波又来侵袭啊!
最后查看jmeter上给出的聚合报告:

吞吐量维持在122.7每秒。从这个案例中我们可以看到老年代34176k基本已经满了,经过FUll GC之后新生代会有一点剩余的空间。总的来说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 性能调优
1,新建web 测试项目并且发布到Tomcat,访问路径:http://127.0.0.1:8080/JvmWeb/index @WebServlet("/index") publ ...
- jvm系列(五):tomcat性能调优和性能监控(visualvm)
tomcat服务器优化 1.JDK内存优化 根据服务器物理内容情况配置相关参数优化tomcat性能.当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃.因此一般建议堆的最 ...
- Tomcat(JVM)性能监控方法
Tomcat(JVM)监控方法 1.Tomcat自带的监控页面 配置详见Tomcat安装配置监控一文,如图所示为监控页面: 2.LoadRunner编写脚本实现Tomcat监控 采用编写VuGen脚本 ...
- Tomcat性能调优-JVM监控与调优
参数设置 在Java虚拟机的参数中,有3种表示方法用"ps -ef |grep "java"命令,可以得到当前Java进程的所有启动参数和配置参数: 标准参数(-),所有 ...
- Tomcat和JVM的性能调优总结
Tomcat性能调优: 找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创 ...
- 《Tomcat和JVM的性能调优你真的学会了吗?》总结篇
Tomcat性能调优: 找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创 ...
- JVM虚拟机详解+Tomcat性能优化
1.JVM(java virtual mechinal) ()JVM有完善的硬件架构,如处理器.堆栈.寄存器当,还具有相应的指令系统. ()JVM的主要工作时解释自己的指令集(即字节码),并映射到本地 ...
- 一份 Tomcat 和 JVM 的性能调优经验总结!拿走不谢
Tomcat性能调优 找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创建 ...
- 性能优化 | Tomcat和JVM的性能调优总结
Tomcat性能调优: 找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创 ...
随机推荐
- 微信公共平台开发-(.net实现)5--access_token过期的问题
每次在于微信交互时,都要用到access_token,但是这个值限制的是有时间的,但是access_token,在以后的高级功能里面会经常用到,所以这里不得不这里对前面所讲解的access_token ...
- Entity FrameWork 单表对多实体
一个影片信息Clips表,四个字段:clipId,clipName,fileSize,fileName 方案一: [Table("Clips")] public class Cli ...
- array new 与 array deletedelete
以前在看C++书和上C++课的时候可以看到 delete[] pointer; 的用法,而大多数对于这个用法没有具体的解释,多是看到: 有一个delete运算符的特殊语法,可以释放动态分配的数组内存: ...
- 【腾讯Bugly干货分享】从0到1打造直播 App
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d42e7fd6ec467453bf58 作者:李智文 概要 分享内容: ...
- 用curl向指定地址POST一个JSON格式的数据
昨天的一个任务,用POST 方式向一个指定的URL推送数据.以前都用的数组来完成这个工作. 现在要求用json格式.感觉应该是一样的.开写. <?php $post_url = "ht ...
- 创业6&7
周末两天泡咖啡店. 起不来,只好下午去. 周六5点到9点. 周日3点到12点. 1)整理直播课程讲义.完成50%. 2)修改GMTC演讲稿.完成. 招行的单子还是拒了,目前还没准备好高可用的App服务 ...
- Vuejs注意点
1.多级联动的时候,前一级变的时候,首先要把后面级的内容清空,要不然用户可能把前一次后面级的选择和新的前一级的选择提交(即后边级的列表渲染出来了,单但用户没有选择,此时vue绑定的是上一次的数据). ...
- Atitit 发帖机实现(3 )---usrQBN023 js提交ajax内容到后端规范与标准化
Atitit 发帖机实现(3 )---usrQBN023 js提交ajax内容到后端规范与标准化 大段内容务必要替换转义换行符号1 提交务必使用utf编码,否则解码后的可能缺失,是web serv ...
- WPF仿Win7便笺
最近用WPF写了个仿WIN7下面的便笺小工具,还算是比较华丽的,相似度99%以上吧,在集成了便笺原有的功能以外,当然也做了略微的修改,比如加了关于作者版本信息和修改了原有删除便笺的系统弹出框.软件开机 ...
- 关于Git和Github你不知道的十件事
Git 和 GitHub都是非常强大的工具.即使你已经使用他们很长时间,你也很有可能不知道每个细节.我整理了Git和GitHub可能提高日常效率的10个常用技巧. GitHub 快捷键: t 和 w ...