JVM Tomcat性能实战(推荐)
作者:jingxian 发布时间:2022-02-11 22:34:02
本节只是介绍实战部分,具体的理论参数,请自行百度。
所需工具: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


猜你喜欢
- 在一个项目中,如果我们既用到了Struts2又用到了Servlet,项目运行时有可能无法正常访问Servlet,原因是在配置Struts的过
- 查找应用进程PID杀死应用进程PID运行启动脚本烦不烦啊,像我这么懒得人 得想个办法一步搞定!如下所示 新建一个shell脚本,然后将其运行
- 1,创建存储过程create proc Pro_Login(@UserName nvarchar(10),@PassWord nvarcha
- 介绍前面一章说了AbstractApplicationContext中的refresh方法中的invokeBeanFactoryPostPr
- 在SpringAMQP的发送方法中,接收消息的类型是Object,也就是说我们可以发送任意对象类型的消息,SpringAMQP会帮我们序列化
- 最近微框架spring-boot很火,笔者也跟风学习了一下,废话不多说,现给出一个读取配置文件的例子。首先,需要在pom文件中依赖以下jar
- 前言数据库的性能优化行业里面普遍偏少,今天这篇希望给大家带来点帮助SQLite是个典型的嵌入式DBMS,它有很多优点,它是轻量级的,在编译之
- 今天在接手别人的一个项目的时候遇到一个坑,坑死我了;是一个打包的问题,好不容易我把代码写完了准备打包测试了,结果java -jar xxx.
- 随着现在分布式架构越来越盛行,在很多场景下需要使用到分布式锁。很多小伙伴对于分布式锁还不是特别了解,所以特地总结了一篇文章,让大家一文读懂分
- JAVA中反射机制(JavaBean的内省与BeanUtils库)内省(Introspector) 是Java 语言对JavaBean类属性
- 还原背景大家都做过b-s架构的应用,也就是基于浏览器的软件应用。现在呢有个场景就是FE端也就是前端工程是前后端分离的,采用主流的前端框架VU
- 在我们的web开发中,很多的时候都需要把本机的一些文件上传到web服务器上面去。如:一个BBS系统,当用户使用这是系统的时候,能把本机的一些
- 前言在进行lua方法注册的时候, 大多数解决方案直接否定了泛型方法, 因为在lua侧难以表达出泛型, 以及lua的函数重载问题,函数重载问题
- MybatisMyBatis ,是国内最火的持久层框架采用了ORM思想解决了实体类和数据库表映射的问题。对JDBC进行了封装,屏蔽了JDBC
- 这篇文章主要介绍了SpringBoot Jpa分页查询配置方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 一、概述在上一篇的叙述中,我们通过图层的方式完成了图片颜色的填充(详情请戳:Android不规则图像填充颜色小游戏),不过在着色游戏中更多的
- MybatisPlus分页排序查询字段带有下划线如果使用MybatisPlus的自动转驼峰命名法,分页排序查询的字段带有下划线时,会出问题。
- import java.lang.reflect.InvocationHandler;import java.lang.reflect.Me
- 前言关于mybatis-plus的简介以及基本使用,我在《SpringBoot整合mybatis-plus–入门超详细》一文中已做介绍,此处
- 技术看点 WinForm自定义控件的使用自定义控件gif动画的播放需求及效果又来一波 C# GDI自定义控件show 。这个控件已