1.指定使用JDK的路径和vm参数配置
修改bin文件中的catalina.bat,大约95行setlocal之上加入如下内容:
set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=256M -XX:MaxPermSize=512M//配置vm参数,根据系统实际情况配置
set JAVA_HOME=...\jdk1.8.0_92//指定相应版本的jdk路径
set JRE_HOME=...\jdk1.8.0_92\jre
堆内存分配
-Xms<size> 表示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。一般建议堆的最大值设置为可用内存的最大值的80%,并将-Xms和-Xmx选项设置为相同,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等避免在每次GC 后调整堆的大小。
持久态内存内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
2.修改server.xml
修改conf路径下的server.xml,将
<!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> -->
修改为
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" //最大并发数,默认设置 200,一般建议在 500 ~ 800,根据硬件设施和业务来判断 minSpareThreads="100" //Tomcat 初始化时创建的线程数,默认设置 25 prestartminSpareThreads = "true"//在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就无效 maxQueueSize = "100"//最大的等待队列数,超过则拒绝请求 />
修改默认的链接参数配置,将
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改为
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" //Tomcat 8 设置 nio2 更好,Tomcat 6、7设置nio更好:org.apache.coyote.http11.Http11NioProtocol connectionTimeout="20000" maxConnections="10000" redirectPort="8443" enableLookups="false" //禁用DNS查询 acceptCount="100" //指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认设置 100 maxPostSize="10485760" //以 FORM URL 参数方式的 POST 提交方式,限制提交最大的大小,默认是 2097152(2兆),它使用的单位是字节。10485760 为 10M。如果要禁用限制,则可以设置为 -1。 compression="on" disableUploadTimeout="true" compressionMinSize="2048" acceptorThreadCount="2" //用于接收连接的线程的数量,默认值是1。一般这个指需要改动的时候是因为该服务器是一个多核CPU,如果是多核 CPU 一般配置为 2. compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" URIEncoding="utf-8" />
3.关于Tomcat不定期close_wait过多的问题
服务器启动一段时间后出现如下问题:
解决:close_wait 是什么,这个状态与 time_wait 有一定的相似之处,都会持有这个连接一定的时间不放。我们知道,几乎所有的操作系统对单个进程的句柄数(连接数)都有限制,例如多数 linux 系统默认是 1024 个。因为那些处于 wait 的连接太多,导致可用连接应接不暇。禁用 wait ,让连接在返回后立马关闭,成为一个可用连接。
以 tomcat 为例:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" maxThreads="1000" URIEncoding="UTF-8" keepAliveTimeout="0" />
注意 keepAliveTimeout="0" 即为关键所在
参考链接:
http://blog.csdn.net/jiang1245764446/article/details/51898723
https://segmentfault.com/q/1010000003919178