Tomcat的优化策略

Posted Java架构师进阶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat的优化策略相关的知识,希望对你有一定的参考价值。

在开始讨论Tomcat的优化策略之前我们需要知道在不同的操作系统位数下(32位和64位)32位操作系统的JVM会受最大2G内存的限制不管你物理机上有多少内存,JVM只能使用到2G性能可想而知,所以建议开发环境使用64位系统

 

 图是32位和64位操作系统的内存限制对比:



Tomcat优化分为两块: 

1. Tomcat启动命令行中的参数优化(JVM优化)。

2. Tomcat自身容器的参数优化。


(一)JVM优化


Linux系统中tomcat的启动参数


Tomcat的优化策略


Windows系统中tomcat的启动参数


Tomcat的优化策略


上面参数有很多,可能有人写到现在都没见一个tomcat的启动命令里加了这么多参数,这些参数只是我机器上的,不一定适合你,尤其是参数后的value(值)是需要根据你自己的实际情况来设置的。  

 

参数解释:


1.  -server


只要你的tomcat是运行在生产环境中的,这个参数必须加上

tomcat默认是以一种叫java –client的模式来运行的,server即意味着你的tomcat是以真实的production模式在运行,也就意味着你的tomcatserver模式运行时将拥有:更大、更高的并发处理能力,更快更便捷JVM垃圾回收机制,可以获得更多的负载与吞吐量。


2. -Xms–Xmx


默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制

默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制

  

3. –Xmn


设置年轻代大小为512m整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8


4. -Xss


是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程 大约需要占用多少内存,可能会有多少线程同时运行等。一般不易设置超过1M,要不然容易出现out ofmemory


5. -XX:+AggressiveOpts


作用如其名(aggressive),启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术(如果有的话)


6. -XX:+UseBiasedLocking


启用一个优化了的线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配。


7. -XX:PermSize=128M-XX:MaxPermSize=256M


JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64

在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。

XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4

那么,如果是物理内存4GB,那么64分之一就是64MB,这就是PermSize默认值,也就是永生代内存初始大小

四分之一是1024MB,这就是MaxPermSize默认大小。


8. -XX:+DisableExplicitGC


在程序代码中不允许有显示的调用”System.gc()”。看到过有两个极品工程中每次在DAO操作结束时手动调用System.gc()一下,觉得这样做好像能够解决它们的out ofmemory问题一样,付出的代价就是系统响应时间严重降低,这样去调用GC导致系统的JVM大起大落


9. -XX:+UseParNewGC


对年轻代采用多线程并行回收,这样收得快。


10. -XX:+UseConcMarkSweepGC


CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。

我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒。


11. -XX:MaxTenuringThreshold


设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。

这个值的设置是根据本地的jprofiler监控后得到的一个理想的值,不能一概而论原搬照抄。


12. -XX:+CMSParallelRemarkEnabled


在使用UseParNewGC 的情况下, 尽量减少 mark 的时间


13. -XX:+UseCMSCompactAtFullCollection


在使用concurrent gc 的情况下, 防止 memoryfragmention, live object 进行整理, 使 memory 碎片减少。


14. -XX:LargePageSizeInBytes


指定 Java heap的分页页面大小


15. -XX:+UseFastAccessorMethods


getset 方法转成本地代码


16. -XX:+UseCMSInitiatingOccupancyOnly


指示只有在 oldgeneration 在使用了初始化的比例后concurrent collector 启动收集   


17. -XX:CMSInitiatingOccupancyFraction=70


CMSInitiatingOccupancyFraction,这个参数设置有很大技巧,基本上满足(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn就不会出现promotion failed。在我的应用中Xmx6000Xmn512,那么Xmx-Xmn5488兆,也就是年老代有5488 兆,CMSInitiatingOccupancyFraction=90说明年老代到90%满的时候开始执行对年老代的并发垃圾回收(CMS),这时还 剩10%的空间是5488*10%=548兆,所以即使Xmn(也就是年轻代共512兆)里所有对象都搬到年老代里,548兆的空间也足够了,所以只要满 足上面的公式,就不会出现垃圾回收时的promotion failed因此这个参数的设置必须与Xmn关联在一起。


18. -Djava.awt.headless=true


这个参数一般我们都是放在最后使用的,这全参数的作用是这样的,有时我们会在我们的J2EE工程中使用一些图表工具如:jfreechart,用于在web网页输出GIF/JPG等流,在winodws环境下,一般我们的app server在输出图形时不会碰到什么问题,但是在linux/unix环境下经常会碰到一个exception导致你在winodws开发环境下图片显示的好好可是在linux/unix下却显示不出来,因此加上这个参数以免避这样的情况出现。

 

上述这样的配置,基本上可以达到:

1.   系统响应时间增快

2.   JVM回收速度增快同时又不影响系统的响应率

3.   JVM内存最大化利用

4.   线程阻塞情况最小化

 

(二)容器内的优化


前面我们对Tomcat启动时的命令进行了优化,增加了系统的JVM可使用数、垃圾回收效率与线程阻塞情况、增加了系统响应效率等还有一个很重要的指标,我们没有去做优化,就是吞吐量。 

打开tomcat安装目录confserver.xml文件,定位到这一行: 


Tomcat的优化策略


这一行就是我们的tomcat容器性能参数设置的地方,它一般都会有一个默认值,这些默认值是远远不够我们的使用的,我们来看经过更改后的这一段的配置:


Tomcat的优化策略


参数解释:


1. URIEncoding=”UTF-8”


使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里还有搞个mod_encoding,还要手工编译


2. maxSpareThreads


maxSpareThreads 的意思就是如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。


3.    minSpareThreads


最小备用线程数,tomcat启动时的初始化的线程数。


4.    enableLookups


这个功效和Apache中的HostnameLookups一样,设为关闭。


5.    connectionTimeout


connectionTimeout为网络连接超时时间毫秒数。


6.  maxThreads


maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数。


7.   acceptCount


acceptCount是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection。


8.    maxProcessorsminProcessors


通常Windows1000个左右,Linux2000个左右。


9.   useURIValidationHack


我们来看一下tomcat中的一段源码:


Tomcat的优化策略


可以看到如果把useURIValidationHack设成"false",可以减少它对一些url的不必要的检查从而减省开销。


10.   enableLookups="false"


为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值。


11.   disableUploadTimeout


类似于Apache中的keeyalive一样


Tomcat配置gzip压缩(HTTP压缩)功能



HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程html,CSS,Java , Text ,它可以节省40%左右的流量更为重要的是,它可以对动态生成的,包括CGIphp , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人。


每个参数的解释如下:


1.   compression="on"


打开压缩功能


2.   compressionMinSize="2048"


启用压缩的输出内容大小,这里面默认为2KB


3.   noCompressionUserAgents="gozilla, traviata"


对于以下的浏览器,不启用压缩


4.   compressableMimeType="text/html,text/xml"


压缩类型


最后不要忘了把8443端口的地方也加上同样的配置,因为如果我们走https协议的话,我们将会用到8443端口这个段的配置,对吧?



到此为止,所有Tomcat优化的地方都加上了,当然这边没有提及任何关于数据库优化的步骤,仅凭这两步,我们的系统就已经有了很大的提升可见Tomcat优化是如此重要!







以上是关于Tomcat的优化策略的主要内容,如果未能解决你的问题,请参考以下文章

tomcat学习笔记Tomcat性能优化

对Tomcat 8.0进行JVM层面的优化(基于Oracle JDK 8)

jvm与tomcat启动优化配置

jvm 调整tomcat的堆内存和常驻内存catalina.sh

Tomcat优化

Tomcat调优总结(Tomcat自身优化Linux内核优化JVM优化)