Tomcat、JVM 优化配置

为了让Tomcat稳定长期的运行,提高性能,默认的配置肯定是不行的。
从两个方向入手:Tomcat本身配置优化和JVM优化

环境:Tomcat8+JDK1.8+Linux Ubuntu16.04


一、Tomcat配置优化

Tomcat本身配置优化就是修改server.xml文件的相关参数:

<?xml version="1.0" encoding="UTF-8"?>

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="500" minSpareThreads="20" maxSpareThreads="50" maxIdleTime="60000"/>

    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               URIEncoding="UTF-8"
               connectionTimeout="30000"
               enableLookups="false"
               disableUploadTimeout="false"
               connectionUploadTimeout="150000"
               acceptCount="300"
               keepAliveTimeout="120000"
               maxKeepAliveRequests="1"
               tcpNoDelay="true" --tcp不延迟
               compression="on"
               compressionMinSize="2048"         
               noCompressionUserAgents="gozilla,traviata" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png"  
               />

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    <Context path="" docBase="/usr/tomcat/apache-tomcat-8.5.24/webapps/dnHomePage" debug="0" reloadable="true"/>
      </Host>
    </Engine>
  </Service>
</Server>

tomcatThreadPool:修改线程池相关参数

  • maxThreads :Tomcat 使用线程来处理接收的每个请求,可创建的最大的线程数,最大线程 500(一般服务器足以),要根据自己的实际情况合理设置,设置越大会耗费内存和 CPU
  • minSpareThreads:最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待
  • maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程
  • maxIdleTime:线程最大空闲时间 60 秒

URIEncoding:指定 Tomcat 容器的 URL 编码格式
connnectionTimeout: 网络连接超时,单位:毫秒,设置为 0 表示永不超时,通常设置为 30000 毫秒
enableLookups: 是否反查域名,以返回远程主机的主机名,取值为:true 或 false,如果设置为false,则直接返回IP地址,为了提高处理能力,应设置为 false
disableUploadTimeout:上传时是否使用超时机制
connectionUploadTimeout:上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使Servlet有较长的时间来完成它的执行,需要与disableUploadTimeout一起配合使用才会生效
acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为100个
keepAliveTimeout:长连接最大保持时间(毫秒),表示在下次请求过来之前,Tomcat 保持该连接多久,默认是使用 connectionTimeout 时间,-1 为不限制超时
maxKeepAliveRequests:表示在服务器关闭之前,该连接最大支持的请求数。超过该请求数的连接也将被关闭,1表示禁用,-1表示不限制个数,默认100个,一般设置在100~200之间
tcpNoDelay:”true” tcp不延迟
compression:是否对响应的数据进行 GZIP 压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off,压缩数据后可以有效的减少页面的大小,一般可以减小1/3左右,节省带宽
compressionMinSize:表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是2048
noCompressionUserAgents:设置哪些浏览器不压缩
compressableMimeType:压缩类型,指定对哪些类型的文件进行数据压缩


二、JVM参数优化

JDK版本不同参数配置也可能不同!
Tomcat 启动参数配置位于安装目录 bin目录下,Linux 操作系统就是 catalina.sh 启动文件。Windows是 catalina.bat启动文件。

  • catalina.bat用JAVA_OPTS:用于当 Java 运行时选项“start”、“stop”或“run”命令执行
  • catalina.sh用CATALINA_OPTS:用于当 Java 运行时选项“start”或“run”命令执行

1、Linux

配置之前先查看自己服务器的内存:free -m
参数信息参考:Linux服务器如何查看CPU占用率、内存占用、带宽占用
这里写图片描述

我这里是Linux Ubuntu16.04(1G)系统,在catalina.sh最后一行注释下面添加:

CATALINA_OPTS="
-Xmx250m 
-Xms250m
-Xmn100m
-XX:SurvivorRatio=8
-XX:+UseG1GC
-XX:MaxTenuringThreshold=14
-XX:ParallelGCThreads=8
-XX:ConcGCThreads=8
-XX:+DisableExplicitGC
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=d:/a.dump
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-XX:+TraceClassLoading
-XX:+PrintClassHistogram"

如图:
这里写图片描述
-Xmx250m        最大堆大小
-Xms250m         初始堆大小
-Xmn100m          年轻代大小
-XX:SurvivorRatio=8       Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
-XX:+UseG1GC       使用 G1 (Garbage First) 垃圾收集器
-XX:MaxTenuringThreshold=14   提升年老代的最大临界值(tenuring threshold). 默认值为 15[每次GC,增加1岁,到15岁如果还要存活,放入Old区]
-XX:ParallelGCThreads=8   设置垃圾收集器在并行阶段使用的线程数[一般设置为本机CPU线程数相等,即本机同时可以处理的个数,设置过大也没有用]
-XX:ConcGCThreads=8     并发垃圾收集器使用的线程数量
-XX:+DisableExplicitGC          禁止在启动期间显式调用System.gc()
-XX:+HeapDumpOnOutOfMemoryError OOM时导出堆到文件
-XX:HeapDumpPath=d:/a.dump    导出OOM的路径
-XX:+PrintGCDetails      打印GC详细信息
-XX:+PrintGCTimeStamps     打印CG发生的时间戳
-XX:+PrintHeapAtGC       每一次GC前和GC后,都打印堆信息
-XX:+TraceClassLoading     监控类的加载
-XX:+PrintClassHistogram       按下Ctrl+Break后,打印类的信息

2、Windows

Win10(8G)
在bin目录下修改catalina.bat文件,在如图位置添加配置参数:

这里写图片描述

set “JAVA_OPTS=-Xmx800m -Xms800m -Xmn200m -XX:SurvivorRatio=8”
这里只是列几个参数,其它需要的参数添加上就好了。


参考文章:
JVM7、8详解及优化
Tomcat 调优及 JVM 参数优化
【JVM】调优笔记2—–JVM在JDK1.8以后的新特性以及VisualVM的安装使用

猜你喜欢

转载自blog.csdn.net/axela30w/article/details/79231535