工做中项目的缘由,项目云上贵州服务器有时候支撑不起过高的并发量,并且又没那么快更换更优的服务器,因此只能从tomcat上去作一些优化了。javascript
tomcat优化我是从两个地方入手,一个就是server.xml,还有一个就是catalina.sh。css
找到tomcat->conf下的server.xmlhtml
<!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> -->
复制代码
这里默认是注释掉的,咱们修改成:java
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="900" minSpareThreads="100" maxSpareThreads="500" prestartminSpareThreads="true" maxQueueSize="300" />
复制代码
- maxThreads:最大并发数,默认为200,通常设置在600-900
- minSpareThreads:最小备用线程数,tomcat初始化时建立的线程,默认为25
- maxSpareThreads:最大备用线程数
- prestartminSpareThreads:在Tomcat初始化的时候就初始化 minSpareThreads 的参数值,若是不等于 true,minSpareThreads的值就没啥效果了
- maxQueueSize:最大的等待队列数,超过则拒绝请求
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
复制代码
默认的是http协议的,咱们这里先将tomcat设置成了https协议:apache
<Connector port="9090"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
maxThreads="10000"
SSLEnabled="true"
scheme="https"
secure="true"
keystoreFile="cert/wtm-ssl.pfx"
keystorePass="111"
keystoreType="PKCS12"
useBodyEncodingForURI="true"
clientAuth="false"
sslProtocol="TLS"
connectionTimeout="20000"
redirectPort="8443"
复制代码
需不须要改为https协议按业务来分,在此基础上接着:tomcat
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"
/>
复制代码
首先要执行以前配置的tomcat线程池bash
- 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/bin/catalina.sh文件中,将下列添加到文件第一行:
若是服务器只运行一个tomcat服务器
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"
复制代码
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"
复制代码
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"
复制代码
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的内存分为2类,一个是perm型,一个是generation型。perm区域存放的是class这些静态信息,通常默认为64m,若是项目很大,有可能已启动就会报错:out of memory permsize。从新设置一下permsize就能够解决。app
而generation区域,应用代码基本在这个区域活动,new的类都会在这个区域,并且jvm的绝大部分工做也在这里。大体理解一下:
这个区域区域包含新生代和老生代区域,全部new出来的会放置在新区域,而屡次回收失败的一些一直被使用的实例则会被转移到老生代,因此新生代区域的活动很频繁。新生代内存不足会触发一次这个区域的GC---而后再到老生代GC---最后FULL GC。FULL GC代价很高,应尽可能避免,尽可能在newsize参数的这个区gc,通常配置 newsize分配到总内存1/4左右,---最终,若是full gc 仍是内存不足,那就会引起out of memory 常见的那种。