一 内存优化
启动时告诉JVM要一块多大内存,这块调优是效果最直接的方式,Tomcat 的启动参数位于tomcat的安装目录bin目录下,如果是Linux操作系统就是catalina.sh文件,如果是Windows操作系统那么就是catalina.bat文件。打开该文件,一般该文件头部是一堆的由##包裹着的注释文字,找到注释文字的最后一段如:
中间红色模块就是需要加入到参数:
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文件,定位到这一行:
这些都是默认的配置,我一般生产环境类似下面这样配置:
<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大小。