Tomcat 性能优化
启动参数优化
启动溢出
tomcat为了支持servlet3.0的特性,比如说支持@WebServlet、@WebListener等等,要支持这些特性,tomcat就得去扫描所有的jar包里面的每个类。这个异常表明在扫描jar包的时候,递归调用太深,导致栈溢出了,tomcat给了一个馊主意,让你增大xss,这个还是不好,xss加大了,可用线程数就少了。
spring-amqp-*.jar,\
spring-aop-*.jar,\
spring-aspects-*.jar,\
spring-beans-*.jar,\
bcpkix-*.jar,bcprov-*.jar,fr-*.jar
其他说明:
1)、bcprov-ext-jdk15on-1.54.jar
、bcprov-jdk15on-1.54.jar
、fr-third-7.1.jar
这三个包本来就重复了,可以去掉bcprov-*;
2)、如果只有bcprov-ext-jdk15on-1.54.jar
、bcprov-jdk15on-1.54.jar
这两个包,可以只保留bcprov-ext-jdk15on-1.54.jar
,因为bcprov-ext-jdk15on-1.54.jar
包含了bcprov-jdk15on-1.54.jar
;
3)、如果感觉tomcat启动慢,那是因为要扫描jar里的servlet3.0注解,可以在conf/ catalina.properties文件中tomcat.util.scan.StandardJarScanFilter.jarsToSkip
末尾增加不需要扫描的jar来提速,
如果你不想使用servlet3.0 annotation支持,在tomcat的catalina.properties
配置文件中tomcat.util.scan.DefaultJarScanner.jarsToSkip
的值后面加一个,*
,这样就不会扫描所有的jar包了。启动更快,也不会出异常。
Linux
要添加在tomcat 的bin 下catalina.sh 里,位置cygwin=false
前。
JAVA_OPTS="-Xms512m -Xmx512m -XX:ParallelGCThreads=8 -XX:PermSize=128m -XX:MaxPermSize=256m"
Windows
要添加在tomcat 的bin 下catalina.bat 里
set JAVA_OPTS=-Xms512m -Xmx512m -XX:ParallelGCThreads=8 -XX:PermSize=128m -XX:MaxPermSize=256m
说明:
-server:一定要作为第一个参数,在多个CPU时性能更佳
-Xms:初始Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:java heap最大值,使用的最大内存 把Xms与Xmx两个值设成一样是最优的做法
-XX:PermSize:设定内存的永久保存区域,在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误,默认是物理内存的1/64;
-XX:MaxPermSize:设定最大内存的永久保存区域,默认是物理内存的1/4;
-XX:MaxNewSize:
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小,一般不易设置超过1M,要不然容易出现out ofmemory
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC: 缩短minor收集的时间
-XX:+AggressiveOpts:每当JDK版本升级时,你的JVM都会使用最新加入的优化技术(如果有的话)
-XX:+UseBiasedLocking:使得你的appserver内对线程处理自动进行最优调配
-XX:+DisableExplicitGC:程序代码中不允许有显示的调用”System.gc()”
-XX:+UseParNewGC:对young generation采用多线程并行回收
-Djava.awt.headless=true:一般放在最后使用的,有时我们会在我们的J2EE工程中使用一些图表工具如:jfreechart,用于在web 网页输出GIF/JPG等流,在winodws环境下,一般我们的app server在输出图形时不会碰到什么问题,但是在linux/unix环境下经常会碰到一个exception导致你在winodws开发环境下图片显 示的好好可是在linux/unix下却显示不出来,因此加上这个参数以免避这样的情况出现。
容器优化
打开tomcat安装目录\conf\server.xml文件,定位到这一行:
<connector port="8080" protocol="HTTP/1.1">
这一行就是我们的tomcat容器性能参数设置的地方,它一般都会有一个默认值,这些默认值是远远不够我们的使用的,我们来看经过更改后的这一段的配置:
<connector port="8080" protocol="HTTP/1.1" <="" p="" style="word-wrap: break-word;">
URIEncoding="UTF-8"
minSpareThreads="25"
maxSpareThreads="75"
enableLookups="false"
disableUploadTimeout="true"
connectionTimeout="20000"
acceptCount="300"
maxThreads="300"
maxProcessors="1000"
minProcessors="5"
useURIValidationHack="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
redirectPort="8443"
/>
参数说明:
- URIEncoding=”UTF-8”:使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里还有搞个mod_encoding,还要手工编译
- maxSpareThreads:如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。
- minSpareThreads:最小备用线程数,tomcat启动时的初始化的线程数。
- enableLookups:这个功效和Apache中的HostnameLookups一样,设为关闭。
- connectionTimeout:网络连接超时时间毫秒数。
- maxThreads:Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数。
- acceptCount:当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection
- maxProcessors与minProcessors:在 Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最 大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。
通常Windows是1000个左右,Linux是2000个左右。
- useURIValidationHack:设成"false",可以减少它对一些url的不必要的检查从而减省开销
- enableLookups=“false”:为了消除DNS查询对性能的影响我们可以关闭DNS查询
- disableUploadTimeout:类似于Apache中的keeyalive一样
客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览,HTTP 压缩可以大大提高浏览网站的速度,节省40%左右的流量,更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人
- compression=“on” 打开压缩功能
- compressionMinSize=“2048” 启用压缩的输出内容大小,这里面默认为2KB
- noCompressionUserAgents=“gozilla, traviata” 对于以下的浏览器,不启用压缩
- compressableMimeType=“text/html,text/xml” 压缩类型
最后,不要忘了把8443端口的地方也加上同样的配置,因为如果我们走https协议的话,我们将会用到8443端口这个段的配置