Tomcat8.x版本优化
Tomcat8.x版本优化
操作系统版本 | Tomcat版本 | IP |
---|---|---|
RHEL 7.x | 8.x | 172.21.3.220 |
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">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
executor="tomcatThreadPool"
maxConnections="900"
enableLookups="false"
acceptCount="700"
maxPostSize="10485760"
disableUploadTimeout="true"
compression="on"
compressionMinSize="2048"
maxProcessors="1000"
minProcessors="5"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
URIEncoding="UTF-8" />
<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 "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
首先要执行之前配置的tomcat线程池
- maxConnections:最大连接数
- enableLookups:禁用DNS查询,为了提高性能,设置为false
- acceptCount:当线程数达到maxThreads后后续请求会被放入一个等待队列,这个acceptCount就是这个队列的大小,默认为100
- maxPostSize:以FORM URL参数方式提交post请求,限制提交最大的大小,默认2097152字节(2M)
- disableUploadTimeout:类似于Apache中的keeyalive一样,是否需要tomcat容器单独设置上传时间限制,这里是不用,还是使用标准的,不去给上传的附件单独做超时设置
- compression:设置是否开启GZip压缩HTTP 压缩
- compressionMinSize:启用压缩的输出内容大小,这里面默认为2KB
- maxProcessors:线程共享地址空间
- minProcessors:线程共享地址空间
- compressableMimeType:需要压缩的类型
Tomcat catalina.sh配置文件
- 服务器内存4G:
CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms2048m -Xmx2048m -Xmn1024m
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10
-XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"
- 服务器内存8G:
CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms4096m -Xmx4096m -Xmn2048m
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10
-XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"
- 服务器内存16G:
CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms8192m -Xmx8192m -Xmn4096m
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10
-XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"
- 服务器内存32G:
CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms16384m -Xmx16384m -Xmn8192m
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10
-XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"
参数说明:
- -Dfile.encoding:默认文件编码
- -server:表示这是应用于服务器的配置,JVM 内部会有特殊处理的
- -Xmx1024m:设置JVM最大可用内存为1024MB
- -Xms1024m:设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
- -Xmn1024m:设置JVM新生代大小(JDK1.4之后版本)。一般-Xmn的大小是-Xms的1/2左右,不要设置的过大或过小,过大导致老年代变小,频繁Full GC,过小导致minor GC频繁。如果不设置-Xmn,可以采用-XX:NewRatio=2来设置,也是一样的效果
- -XX:NewSize:设置新生代大小
- -XX:MaxNewSize:设置最大的新生代大小
- -XX:PermSize:设置永久代大小
- -XX:MaxPermSize:设置最大永久代大小
- -XX:NewRatio=4:设置年轻代(Eden和两个Survivor)与终身代的比值(去除永久代)
- -XX:MaxTenuringThreshold=10:设置垃圾最大年龄,默认为:15。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。
- -XX:+DisableExplicitGC:这个将会忽略手动调用 GC 的代码使得 System.gc() 的调用就会变成一个空调用,完全不会触发任何 GC
JVM的垃圾回收机制:
jvm的内存分为2类,一个是perm型,一个是generation型。perm区域存放的是class这些静态信息,一般默认为64m,如果项目很大,有可能已启动就会报错:out of memory permsize。重新设置一下permsize就可以解决。
而generation区域,应用代码基本在这个区域活动,new的类都会在这个区域,而且jvm的绝大部分工作也在这里。大致理解一下:
这个区域区域包含新生代和老生代区域,所有new出来的会放置在新区域,而多次回收失败的一些一直被使用的实例则会被转移到老生代,所以新生代区域的活动很频繁。新生代内存不足会触发一次这个区域的GC---然后再到老生代GC---最后FULL GC。FULL GC代价很高,应尽量避免,尽量在newsize参数的这个区gc,一般配置 newsize分配到总内存1/4左右,---最终,如果full gc 还是内存不足,那就会引发out of memory 常见的那种。