Tomcat调优两个必选项

2018-09-21 16:21:01

一 内存优化

启动时告诉JVM要一块多大内存,这块调优是效果最直接的方式,Tomcat 的启动参数位于tomcat的安装目录bin目录下,如果是Linux操作系统就是catalina.sh文件,如果是Windows操作系统那么就是catalina.bat文件。打开该文件,一般该文件头部是一堆的由##包裹着的注释文字,找到注释文字的最后一段如:

123.png

中间红色模块就是需要加入到参数:

export JAVA_OPTS="-server -Xms1000M -Xmx1000M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "

-server:这个参数表示tomcat以更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量,一定要加上。

-Xms:JVM初始化堆的大小。

-Xmx:JVM堆的最大值。

我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存,一般建议堆的最大值设置为可用内存的最大值的80%,Tomcat默认可以使用的内存为128MB,在线上稍微大点的应用项目中,这点内存是不够的,需要调大。

-Xss:是指设定每个线程的堆栈大小。这个就要依据具体程序,看一个线程大约需要占用多少内存,可能会有多少线程同时运行等。一般不要设置超过1M,要不然容易出现out of memory。

-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64。

-XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。

在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。

所以一般我们最精简的配置方式就是:export JAVA_OPTS="-server -Xms1000M -Xmx1000M -Xss512k -XX:PermSize=128M -XX:MaxPermSize=256M",如果配置了这些,Tomcat基本可以飞一样的快了。

二 线程优化

我们对Tomcat启动时的命令进行了优化,增加了系统的JVM可使用数、垃圾回收效率与线程阻塞情况、增加了系统响应效率等还有一个很重要的指标,我们没有去做优化,就是吞吐量。

打开tomcat安装目录confserver.xml文件,定位到这一行:

456.png

这些都是默认的配置,我一般生产环境类似下面这样配置:

<Connector port="8989" protocol="HTTP/1.1"

               URIEncoding="UTF-8"  

               minSpareThreads="25"

               maxSpareThreads="75"

               enableLookups="false" 

               disableUploadTimeout="true"

               connectionUploadTimeout="60000"

               connectionTimeout="20000"

               acceptCount="300"  

               maxThreads="300" 

               maxProcessors="1000" 

               minProcessors="5"

               redirectPort="8443" />


URIEncoding=”UTF-8”:使得tomcat可以解析含有中文名的文件的url,一般jsp页面上的乱码问题也通过配置此项可以解决。

minSpareThreads:最小备用线程数,tomcat启动时的初始化的线程数。

maxSpareThreads:如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。

enableLookups:这个功效和Apache中的HostnameLookups一样,一般设为关闭。

disableUploadTimeout:允许Servlet容器,正在执行使用一个较长的连接超时值,以使Servlet有较长的时间来完成它的执行,默认值为false。 这个参数一般和 connectionUploadTimeout两个参数一起配合才能设置文件上传的超时时间为60秒,毕竟文件上传可能需要消耗更多的时间,这个根据你具体业务需要自己调。

connectionTimeout:设置连接的超时值,以毫秒为单位。默认值为60000=60秒。

acceptCount:是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接拒绝连接。

minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10。

maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75。

maxThreads:可创建的最大的线程数,默认值150。

关于tomcat优化方面的调优参数很多,我们只要掌握其中一部分关键的参数是必须优化的,这样tomcat的性能基本不会太差。


tomcat常见的内存溢出有以下两种:

1.java.lang.OutOfMemoryError: PermGen space

解决方法:设置MaxPermSize大小。

2.java.lang.OutOfMemoryError: Java heap space

解决方法:设置-Xms和-Xmx大小。

(微信打赏)

(支付宝打赏)
原创不易,谢谢赞赏。你的支持就是我的动力,我会更加努力。
  1. 2018-09-24 10:04:36

    最后两个out of memory error,我遇到过,当时网上搜了好久才解决的,早点看到楼主的分享就能省很多事了

最近有朋友去过阿里面试,回来有聊到关于jvm这块的一些理论知识,记录如下

阿里云产品1000元服务器代金券大礼包免费领取。

阿里云服务器低门槛上云捷径,普惠上云,云服务器1核1G仅需293元/年。

企业级高性能实例,限时2-5折,限首次购买ECS用户参与,限购4台。