java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Tomcat调优

Tomcat调优详解

作者:敢敢936

这篇文章主要介绍了Tomcat调优方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

Tomcat作为一个Java Servlet容器用于运行Web应用程序,其性能和吞吐量对于确保应用程序的快速响应和高效运行至关重要。

因此,Tomcat调优是为了最大限度地提高系统的性能和可扩展性,以满足高并发和大流量的需求。

由于Tomcat的运行依赖于JVM,从虚拟机的角度把Tomcat的调整分为外部环境调优JVM和Tomcat自身调优两部分,当然操作系统(内核参数)也需要配合调整优化。 

Tomcat 在目前的网络编程中是举足轻重的,由于Tomcat的运行依赖于JVM,从虚拟机的角度把Tomcat的调整分为外部环境调优 JVM 和 Tomcat 自身调优两部分:

一、JVM

1.JVM 组成

1.1 JVM 组成部分:

1.2jvm运行时,数据区的构成:

1.3垃圾确定方法:

2.垃圾回收基本算法

2.1 标记-清除 Mark-Sweep:

分垃圾标记阶段和内存释放阶段。

标记阶段,找到所有可访问对象打个标记。

清理阶段,遍历整个堆,对未标记对象(即不再使用的对象)逐一进行清理。

2.2 标记压缩(压实)Mark-Compact:

分垃圾标记阶段和内存整理阶段。

标记阶段,找到所有可访问对象打个标记。

内存清理阶段时,整理时将对象向内存一端移动,整理后存活对象连续的集中在内存一端。

标记-压缩算法好处是整理后内存空间连续分配,有大段的连续内存可分配,没有内存碎片。

缺点是内存整理过程有消耗,效率相对低下。

2.3 复制 Copying:

先将可用内存分为大小相同两块区域A和B,每次只用其中一块,比如A。

当A用完后,则将A中存活的对象复制到B。

复制到B的时候连续的使用内存,最后将A一次性清除干净。

缺点是比较浪费内存,只能使用原来一半内存,因为内存对半划分了,复制过程毕竟也是有代价。

好处是没有碎片,复制过程中保证对象使用连续空间,且一次性清除所有垃圾,所以效率很高。

过程:

2.4 多种算法总结:

没有最好的算法,在不同场景选择最合适的算法

2.5 STW (Stop The World):

对于大多数垃圾回收算法而言,GC 线程工作时,停止所有工作的线程,称为Stop The World。GC 完成时,恢复其他工作线程运行。这也是JVM运行中最头疼的问题。

① 什么时候进入STW状态?

可达性分析算法中枚举根节点(GC Roots)会导致所有Java执行线程停顿,进入STW状态

② 为什么一定要STW停顿的原因?

分析工作必须在一个能确保一致性的快照中进行,一致性指整个分析期间整个执行系统看起来像被冻结在某个时间点上,如果出现分析过程中对象引用关系还在不断变化,则分析结果的准确性无法保证。被STW中断的应用程序线程会在完成GC之后恢复,频繁的中断会让用户感觉卡顿。所以我们要减少STW的发生,也就相当于要想办法降低GC垃圾回收的频率,STW状态和采用哪款GC收集器无关,所有的GC收集器都有这个状态,因为要保证一致性。 但是好的GC收集器可以减少停顿的时间。

3. 分代堆内存GC策略:

3.1 堆内存分代

上述垃圾回收算法都有优缺点,能不能对不同数据进行区分管理,不同分区对数据实施不同回收策略,分而治之。

将heap内存空间分为三个不同类别: 年轻代、老年代、持久代 

解释:

Heap 堆内存分为:

年轻代Young:Young Generation

老年代Tenured:Old Generation, 长时间存活的对象

默认空间大小比例:

规律: 一般情况*99%的对象都是临时对象 

3.2 年轻代回收Minor GC:

通常场景下,大多数对象都不会存活很久,而且创建活动非常多,新生代就需要频繁垃圾回收。但是,如果一个对象一直存活,它最后就在from、to来回复制,如果from区中对象复制次数达到阈值(默认15次,CMS为6次,可通过java的选项 -XX:MaxTenuringThreshold=N 指定),就直接复制到老年代。

3.3 老年代回收 Major GC::

进入老年代的数据较少,所以老年代区被占满的速度较慢,所以垃圾回收也不频繁。如果老年代也满了,会触发老年代GC,称为Old GC或者 Major GC

由于老年代对象一般来说存活次数较长,所以较常采用标记-压缩算法

当老年代满时,会触发 Full GC,即对所有"代"的内存进行垃圾回收

Minor GC比较频繁,Major GC较少。但一般Major GC时,由于老年代对象也可以引用新生代对象,所以先进行一次Minor GC,然后在Major GC会提高效率。可以认为回收老年代的时候完成了一次Full GC。所以可以认为 MajorGC = FullGC。

4. java 内存调整相关参数

4.1 JVM 内存常用相关参数

选项分类:

参数说明举例
-Xms设置应用程序初始使用的堆内存大小(年轻代+老年代)-Xms2g
-Xmx设置应用程序能获得的最大堆内存早期JVM不建议超过32G,内存管理效率下降-Xms4g
-XX:NewSize设置初始新生代大小-XX:NewSize=128m
-XX:MaxNewSize设置最大新生代内存空间-XX:MaxNewSize=256m
-Xmnsize同时设置-XX:NewSize 和 -XX:MaxNewSize,代-Xmn1g
-XX:NewRatio以比例方式设置新生代和老年代-XX:NewRatio=2new/old=1/2
-XX:SurvivorRatio以比例方式设置eden和survivor(S0或S1)-XX:SurvivorRatio=6eden/survivor=6/1new/survivor=8/1
-Xss设置每个线程私有的栈空间大小,依据具体线程-Xss256k

-Xms 和 -Xmx 建议两个值调一样大小

标准选项:

[root@localhost ~]#java
用法: java  [-options] class [args...]
           (执行类)
   或  java  [-options] -jar jarfile [args...]
           (执行 jar 文件)
 
其中选项包括:
    -d32	  使用 32 位数据模型 (如果可用)
    -d64	  使用 64 位数据模型 (如果可用)
    -server	  选择 "server" VM
                  默认 VM 是 server,
                  因为您是在服务器类计算机上运行。
 
 
    -cp <目录和 zip/jar 文件的类搜索路径>
 
    -classpath <目录和 zip/jar 文件的类搜索路径>
                  用 : 分隔的目录, JAR 档案
                  和 ZIP 档案列表, 用于搜索类文件。
    -D<名称>=<值>
                  设置系统属性
    -verbose:[class|gc|jni]
                  启用详细输出
    -version      输出产品版本并退出
    -version:<值>
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  需要指定的版本才能运行
    -showversion  输出产品版本并继续
    -jre-restrict-search | -no-jre-restrict-search
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  在版本搜索中包括/排除用户专用 JRE
    -? -help      输出此帮助消息
 
 
    -X            输出非标准选项的帮助
 
 
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  按指定的粒度启用断言
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  禁用具有指定粒度的断言
    -esa | -enablesystemassertions
                  启用系统断言
    -dsa | -disablesystemassertions
                  禁用系统断言
    -agentlib:<libname>[=<选项>]
                  加载本机代理库 <libname>, 例如 -agentlib:hprof
                  另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
    -agentpath:<pathname>[=<选项>]
                  按完整路径名加载本机代理库
    -javaagent:<jarpath>[=<选项>]
                  加载 Java 编程语言代理, 请参阅 java.lang.instrument
    -splash:<imagepath>
                  使用指定的图像显示启动屏幕

非标准的稳定选项:

[root@localhost ~]#java -X
    -Xmixed           混合模式执行 (默认)
    -Xint             仅解释模式执行
    -Xbootclasspath:<用 : 分隔的目录和 zip/jar 文件>
                      设置搜索路径以引导类和资源
    -Xbootclasspath/a:<用 : 分隔的目录和 zip/jar 文件>
                      附加在引导类路径末尾
    -Xbootclasspath/p:<用 : 分隔的目录和 zip/jar 文件>
                      置于引导类路径之前
    -Xdiag            显示附加诊断消息
    -Xnoclassgc       禁用类垃圾收集
    -Xincgc           启用增量垃圾收集
    -Xloggc:<file>    将 GC 状态记录在文件中 (带时间戳)
    -Xbatch           禁用后台编译
    -Xms<size>        设置初始 Java 堆大小
    -Xmx<size>        设置最大 Java 堆大小
    -Xss<size>        设置 Java 线程堆栈大小
    -Xprof            输出 cpu 配置文件数据
    -Xfuture          启用最严格的检查, 预期将来的默认值
    -Xrs              减少 Java/VM 对操作系统信号的使用 (请参阅文档)
    -Xcheck:jni       对 JNI 函数执行其他检查
    -Xshare:off       不尝试使用共享类数据
    -Xshare:auto      在可能的情况下使用共享类数据 (默认)
    -Xshare:on        要求使用共享类数据, 否则将失败。
    -XshowSettings    显示所有设置并继续
    -XshowSettings:all
                      显示所有设置并继续
    -XshowSettings:vm 显示所有与 vm 相关的设置并继续
    -XshowSettings:properties
                      显示所有属性设置并继续
    -XshowSettings:locale
                      显示所有与区域设置相关的设置并继续
 
-X 选项是非标准选项, 如有更改, 恕不另行通知。

有不稳定选项的当前生效值:

[root@centos7 ~]#java -XX:+PrintFlagsFinal

查看所有不稳定选项的默认值:

[root@centos7 ~]#java -XX:+PrintFlagsInitial

示例:

指定内存空间:

#指定内存空间
[root@centos7 ~]#java -Xms1024m -Xmx1024m -XX:+PrintGCDetails -cp  . Heap
 
#Heap 是一个脚本文件

二、Tomcat 配置文件参数优化

1. 常用的优化相关参数

2. 编辑全局配置 

vim /usr/local/tomcat/conf/server.xml
......
<Connector port="8080" protocol="HTTP/11.1" 
connectionTimeout="20000" 
redirectPort="8443" 
--71行--插入
minSpareThreads="50" 
enableLookups="false" 
disableUploadTimeout="true" 
acceptCount="300" 
maxThreads="500" 
processorCache="500"
URIEncoding="UTF-8" 
maxKeepAliveRequests="100"
compression="on" 
compressionMinSize="2048" 
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image /jpg,image/png"/>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文