当前位置: 首页 > 编程笔记 >

JVM Tomcat性能实战(推荐)

秦胡媚
2023-03-14
本文向大家介绍JVM Tomcat性能实战(推荐),包括了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性能实战(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 1. 前言 本小节,我们一起来学习 PostgreSQL 中的一大杀器——FTS(Full Text Search,全文检索)。 提到全文搜索,你是否立刻想到了大名鼎鼎的Lucene和Elasticsearch。Elasticsearch 基于 Lucene ,并为开发者提供丰富的接口和工具,但是这也造成了它日益庞大。 使用它,你得备上一个大的服务器,一个优秀的运维团队,还要承受数据同步的心智负担

  • 看完了教程,是不是有这么一种感觉:看的时候觉得很简单,照着教程敲代码也没啥大问题。 于是准备开始独立写代码,就发现不知道从哪开始下手了。 这种情况是完全正常的。好比学写作文,学的时候觉得简单,写的时候就无从下笔了。 虽然这个教程是面向小白的零基础Python教程,但是我们的目标不是学到60分,而是学到90分。 所以,用Python写一个真正的Web App吧! 目标 我们设定的实战目标是一个Blo

  • 看完了教程,是不是有这么一种感觉:看的时候觉得很简单,照着教程敲代码也没啥大问题。 于是准备开始独立写代码,就发现不知道从哪开始下手了。 这种情况是完全正常的。好比学写作文,学的时候觉得简单,写的时候就无从下笔了。 虽然这个教程是面向小白的零基础Python教程,但是我们的目标不是学到60分,而是学到90分。 所以,用Python写一个真正的Web App吧! 目标 我们设定的实战目标是一个Blo

  • 本文向大家介绍Python线性回归实战分析,包括了Python线性回归实战分析的使用技巧和注意事项,需要的朋友参考一下 一、线性回归的理论 1)线性回归的基本概念 线性回归是一种有监督的学习算法,它介绍的自变量的和因变量的之间的线性的相关关系,分为一元线性回归和多元的线性回归。一元线性回归是一个自变量和一个因变量间的回归,可以看成是多远线性回归的特例。线性回归可以用来预测和分类,从回归方程可以看出

  • JSON是一种比较重要的格式,尤其是现在的web开发领域,JSON相比于传统的XML更加容易操作和减小传输。 Rust中的JSON处理依赖 cargo 中的rustc-serialize模块 先简单的创建一个Rust项目工程 $ cargo new json_data --bin 生成文件树: vagrant@ubuntu-14:~/tmp/test/rustprimer$ tree . `--

  • 本文向大家介绍JVM性能调优实战:让你的IntelliJ Idea纵享丝滑,包括了JVM性能调优实战:让你的IntelliJ Idea纵享丝滑的使用技巧和注意事项,需要的朋友参考一下 本文已被Github仓库收录 https://github.com/silently9527/JavaCore 前言 在前面整理了一篇关于JVM故障诊断和处理工具,考虑到大部分的Java程序员都使用的是Intelli

  • 前置工作: 安装Solidity的开发框架Truffle,参见:Truffle框架安装 安装开发客户端,参见:Truffle客户端 1. 创建工程目录 在你想放工程的任何位置,创建一个文件夹truffleTest,来做为你的工程根目录。 $ mkdir -p /Users/admin/develop/blockchain_workspace/truffleTest 2. 初始化框架 进入到工程根

  • 本文向大家介绍JavaScript代码性能优化总结(推荐),包括了JavaScript代码性能优化总结(推荐)的使用技巧和注意事项,需要的朋友参考一下 下面是我总结的一些小技巧,仅供参考。 以下代码基本上在jQuery的源码里面都可以看到,如有说得不对的地方,请大家指出。 尽量使用源生方法 javaScript是解释性语言,相比编译性语言执行速度要慢。浏览器已经实现的方法,就不要再去实现一遍了。另