Tomcat运行模式
分3种模式: bio,nio,apr 一般使用nio模式
bio效率低,apr对系统配置有一些比较高的要求
确认Tomcat的运行模式
配置文件 server.xml
1 | <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1024" minSpareThreads="512" prestartminSpareThreads="true" /> |
关键配置
maxThreads 最大线程数, 默认是200
minSpareThread 最小活跃线程数, 默认是25
maxQueueSize 最大的等待队列个数,超过则请求拒绝默认值是Integer.MAX_VALUE ,一般不改变。在某些紧急状态修复问题需要调整
连接器(Connector)优化
Connector是连接器,负责接收客户的请求,以及向客户端回送响应的消息。所以Connector的优化是重要部分。默认情况下 Tomcat只支持200线程访问,超过这个数量的连接将被等待甚至超时放弃,所以我们需要提高这方面的处理能力。
nio配置- server.xml
1 | <Connector port="14081" protocol="org.apache.coyote.http11.Http11NioProtocol"connectionTimeout="20000"executor="tomcatThreadPool" URIEncoding="UTF-8" compression="on" useBodyEncodingForURI="true" enableLookups="false" redirectPort="14443" /> |
影响性能配置
- protocol
1 | org.apache.coyote.http11.Http11Protocol - 阻塞式的Java连接器 |
enableLookups
1
若是你想request.getRemoteHost()的调用履行,以便返回的长途客户端的实际主机名的DNS查询,则设置为true。设置为false时跳过DNS查找,并返回字符串的IP地址(从而提高性能)。默认场景下,禁用DNS查找
compression
1 | 设置成on,开启压缩 |
- 禁用AJP链接器
1 | 使用Nginx+tomcat的架构,用不着AJP协议,所以把AJP连接器禁用 |
优化JVM
修改JAVA_OPTS参数
JDK1.7
1 | JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms512m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=1024M -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:+DisableExplicitGC" |
JDK1.8
1 | JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=1024M -XX:+DisableExplicitGC" |
1.8 版本中已经没有PermSize、MaxPermSize
JAVA8里对metaspace可以在小范围自动扩展永生代避免溢出。
参数说明
- -Djava.awt.headless
1 | 没有设备、键盘或鼠标的模式。 |
- -Dfile.encoding
1 | 设置字符集 |
-server
1
vm的server工作模式,对应的有client工作模式。使用“java -version”可以查看当前工作模式
-Xms1024m
1
初始Heap大小,使用的最小内存
-Xmx1024m
1 | Java heap最大值,使用的最大内存 |
-XX:NewSize=512m
1
表示新生代初始内存的大小,应该小于 -Xms的值
-XX:MaxNewSize=1024M
1
表示新生代可被分配的内存的最大上限,应该小于 -Xmx的值
-XX:PermSize=1024m
1
设定内存的永久保存区域,内存的永久保存区域,VM 存放Class 和 Meta 信息,JVM在运行期间不会清除该区域
程序加载很多class情况下,超出PermSize情况下
JDK1.7会抛出java.lang.OutOfMemoryError: PermGen space异常
JDK1.8下会抛出 ERROR: java.lang.OutOfMemoryError: Metadata space 异常
-XX:MaxPermSize=1024m
1
2设定最大内存的永久保存区域
经验: 设置PermSize大小等于MaxPermSize大小-XX:+DisableExplicitGC
1
自动将System.gc()调用转换成一个空操作,即应用中调用System.gc()会变成一个空操作,避免程序员在代码里进行System.gc()这种危险操作。System.gc() 除非是到了万不得以的情况下不使用,都交给JVM吧
其他优化参数
-XX:SurvivorRatio=2
1
年轻代中Eden区与Survivor区的大小比值
-XX:ReservedCodeCacheSize=256m
1
保留代码占用的内存容量,无大的影响
-Xss1024k
1
单个线程堆栈大小值,减少这个值可以生成更多线程,但操作系统对于一个进程内的线程数是有限制的,经验值在3000-5000左右
-XX:+CMSParallelRemarkEnabled
1
CMS 垃圾回收算法,对响应时间的重要性需求 大于 对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应用中存在比较多的长生命周期的对象的应用
-XX:+UseCMSCompactAtFullCollection
1
在使用concurrent gc 的情况下, 防止 memoryfragmention, 对live object 进行整理, 使 memory 碎片减少。
-XX:+UseCMSInitiatingOccupancyOnly
1
在FULL GC的时候, 对年老代的压缩。CMS是不会移动内存的, 因此这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。可能会影响性能,但是可以消除碎片。
-XX:CMSInitiatingOccupancyFraction=60
1
使用cms作为垃圾回收, 使用60%后开始CMS收集
-XX:+UseGCOverheadLimit
1
2用来限制使用内存,如果不做控制,可能会报出
java.lang.OutOfMemoryError: GC overhead limit exceeded-XX:+UseConcMarkSweepGC
1
使用CMS内存收集
-XX:+UseParNewGC
1
设置年轻代为并行收集
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/x/dump_tomcat.hprof
1
JVM会在遇到OutOfMemoryError时拍摄一个“堆转储快照”,并将其保存在一个文件中。
-Xloggc:/xx/gc_tomcat.log
1
gc的日志,如果该日志中出现频繁的Full GC就是有相关的系统问题,如果很少,说明暂时还算正常
-XX:+PrintGCDateStamps
1
输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDetails
1
输出GC的日志格式
-Dnetworkaddress.cache.ttl=60
-Dsun.net.inetaddr.ttl=60
1
设置DNS缓存时间
-DautoStartup=false
-Dsun.net.client.defaultConnectTimeout=60000
1
连接建立超时时间
-Dsun.net.client.defaultReadTimeout=60000
1
内容获取超时设置
-Djmagick.systemclassloader=no
1
是否生成缩略图的一个框架的配置