tomcat性能优化参数
一. jvm参数优化(catalina.sh中java_opts选项)
1. 初始堆、最大堆大小(xms xmx),初始大小跟最大的大小设置为一样的,好处是减少新生代的GC频率
2. 线程的栈大小(xss),jdk1.5之后默认1M,可以根据配置设置成256k
3. 永久代大小(-XX:PermSize,-XX:MaxPermSize)
4. 年轻代初始空间,最大空间(-Xmn), 年轻代大小(-XX:NewSize),从永久代的参数设置来看他不属于堆的部分
5. 进入老年代的最大年龄(MaxTenuringThreshold),如果系统中对象普遍存活周期长,可以设置为0,不进入新生代,直接进入老年代
5.1 最大垃圾回收暂停(-XX:MaxGCPauseMillis)
垃圾回收时间与非垃圾回收时间的比值( -XX:GCTimeRatio)
6. 串行回收器(-XX:+UseSerialGC)
7. parallel 回收方式
a.特性描述
会集中回收,引发时间比较长的停顿,所以在追求用户高应的场景下并不适合,另外因为大部分时间不会引发停顿,系统的整体吞吐量还是比较大的,
适用于吞吐量要求比较高的场景,例如JOB
b. 配置
新生代一般用Parallel并行方式
-XX:+UseParallelGC 并行GC
-XX:ParallelGCThreads 并行的线程数(一般跟cpu的物理核心数一致)
-XX:+UseParNewGC 新生代用并行GC
-XX:+UseParallelOldGC 老年代用并行GC
8. cms 回收方式
a.特性描述
并发标记清除,标记过程持续的周期长,会引发断断续续的短暂的停顿,比起parallel方式,更适合响应要求高的场景。
-XX:+UseConcMarkSweepGC 并发GC (标记删除,并发标记,并发清除)
对于老年代,采用的是标记清除,他会引起内存碎片,因为清除之后的空间在利用方面不完整,不是那种连续的整块的内存空间,所以要采用压缩算法
-XX:+UseCMSCompactAtFullCollection (并发收集器开启后,最好启用压缩算法)
-XX:CMSFullGCsBeforeCompaction=0 (多少fullGC后进行压缩)
9.yong GC ,full GC
yong GC,针对新生代的GC,也称为minor GC,采用诸如 serial GC,Parrallel GC,本质是一样的,当eden区满了的时候会触发minor GC,把eden区中存活的对象复制到活跃s区,
如果eden区又满了,则会把eden区和活跃s区的存活对象复制到空闲s区,把空闲S区置为活跃S区,老的活跃S区置为空闲S区,
有些对象,在S区中经历了例如15次GC,则会放入老年代,有些对象比较大,eden区放不下,直接放入老年代。
major GC,或者称为 full GC,就是指老年代的GC,是比较大的GC。
10.GC 算法的比较
根搜索算法:这个算法用来判断对象是否存活的,是垃圾回收的辅助算法,从GC root开始遍历,如果对象可达,说明存活,未可达,说明没有引用,
应该被回收。
复制算法:新生代常用的算法,采用两个区的思想,将活跃区的存活对象复制到空闲区,将空闲区置为活跃区,老的活跃区则清理掉所有对象,并且置为
空闲区。复制算法适合存活率低的对象,这样复制的时间减少,因为不存在内存碎片整理的问题,效率相对高效,适合频繁执行,如果存活率高的对象,
复制算法效率很比较低。
标记清除:遍历GC root,如果对象可达则标记为1,不可达则标记为0,表示要清除的,问题是清除之后内存是分散的,有不少碎片。
现实场景下对应CMS。这种方式适合稳定存活的老年代
标记整理:基于标记清除再加上一个整理算法,所以效率相对比较低,现实场景下是在CMS的基础上,开启压缩,并且在可以设置在fullGC几次后
进行压缩。
线上配置案例:
对tomcat jvm参数做了定制化
主要包括采用CMS,并行GC,压缩等等
export JAVA_OPTS="-server -XX:+AggressiveOpts -XX:+DoEscapeAnalysis \ //启用server模式 -Xmx2500m \ //最大堆 2.5G -Xms2500m \ //初始堆 2.5G -Xmn512m \ //新生代 512M -Xss512K \ //线程的栈大小 512K -XX:PermSize=128M \ //永久代 128M -XX:MaxPermSize=256M \ //最大永久代 256M -XX:SurvivorRatio=8 \ //eden区跟s的比例 -XX:+UseCompressedOops \ //启用压缩算法 -XX:+UseParNewGC \ //新生代使用并行收集器 -XX:+UseConcMarkSweepGC \ //老年代使用并发标记清除法 -XX:+CMSClassUnloadingEnabled \ // -XX:+UseCMSCompactAtFullCollection \ //在full gc的时候启用压缩 -XX:CMSFullGCsBeforeCompaction=0 \ //多少次 full gc后进行压缩 -XX:+CMSParallelRemarkEnabled \ //并行的标记 -XX:+DisableExplicitGC \ -XX:+UseCMSInitiatingOccupancyOnly \ -XX:CMSInitiatingOccupancyFraction=75 \ -XX:SoftRefLRUPolicyMSPerMB=0 \
对Connector参数做了少量定制化调优,如最大线程数、maxhttpheader大小等等
<Connector port="8080" protocol="HTTP/1.1" socketBuffer="9000" enableLookups="false" //关闭掉DNS tcpNoDelay="true" minSpareThreads="20" //空闲线程数 maxThreads="1024" //最大线程数 connectionTimeout="5000" maxHttpHeaderSize="32768" acceptCount="150" //最大排队数 redirectPort="8443" />
参考文章: http://blog.csdn.net/xrt95050/article/details/7326179