Tomcat之启动优化
1.概述
2.修改位置
(1)大概在tomcat的bin目录下catalina.sh文件的97行
(2)修改内容如下(一般添加在catalina.sh文件中97行左右)
添加参数如下:
export JAVA_OPTS="-server -Xms1600M -Xmx1600M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true"
注意:在编译的时候需要将Tomcat编译 ./shutdown.sh 编译好之后重新开启 ./startup.sh 然后在执行下面的步骤看是否生效。
3.是否生效
ps -ef | grep tomcat
jmap –heap 进程号 (Tomcat进程号 )
4.参数逐项说明
(1)-server
-server 启用jdk 的 server 版:
只要你的tomcat是运行在生产环境中的,这个参数必须添加,因为tomcat默认是以一种叫java –client的模式来运行的,server即意味着你的tomcat是以真实的production的模式在运行的,这也就意味着你的tomcat以server模式运行时将拥有,更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量。
-server 启用jdk 的 server 版:
只要你的tomcat是运行在生产环境中的,这个参数必须添加,因为tomcat默认是以一种叫java –client的模式来运行的,server即意味着你的tomcat是以真实的production的模式在运行的,这也就意味着你的tomcat以server模式运行时将拥有,更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量。
(2)-Xms–Xmx
-Xms java虚拟机初始化时的最小内存;其初始空间(即-Xms)是物理内存的1/64,
-Xmx java虚拟机可使用的最大内存; 最大空间(-Xmx)是物理内存的1/4,
-Xmn年轻代堆内存大小,默认为物理内存的1/64。
可以利用JVM提供的-Xmn -Xms -Xmx等选项,要加“m”说明是MB,否则就是KB了,在启动tomcat时会报内存不足。
把Xms与Xmx两个值设成一样是最优的做法
把Xms与Xmx两个值设成一样是最优的做法
一般设置-Xms、-Xmx相等以避免在每次GC后调整堆的大小。因为默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。
说明:如何知道我的 JVM 能够使用最大值
(3)-Xss
(4)-XX:+AggressiveOpts
自带魔法属性,从单词可以看出,积极的、生猛的,也即可以将最新版的JDK优化后的新特性自动注入
(5) -XX:+UseBiasedLocking
启用一个优化了的线程锁,对于高并发访问很重要 ,太多的请求忙不过来它自动优化,对于各自长短不一的请求,出现的阻塞、排队现象,他自己优化。
(6)-XX:PermSize -XX:MaxPermSize
-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64,在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。
-XX:MaxPermSize设置最大非堆内存的大小,默认是32M,建议达到物理内存的1/4。
(7)-XX:MaxNewSize
新生代内存的最大内存值,默认是16M
(8)-XX:+DisableExplicitGC
在程序代码中不允许有显示的调用”System.gc()”,避免内存的大起大落
(9)-XX:MaxTenuringThreshold:设置垃圾最大年龄。
①如果设置为零的话,则年轻代对象不经过Survivor区直接进入年老代。对于年老代比较多的应用,可以提高效率。
②如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率,这个值的设置是根据本地监控后得到的一个理想的值,不能一概而论原搬照抄。
(10)-XX:+UseConcMarkSweepGC
即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。
我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒
添加该参数表示启动并发标识-清理(Mark-Sweep)回收器(CMS)
(11)-XX:+UseParNewGC
对年轻代采用多线程并行回收,这样收得快
(12)-XX:+CMSParallelRemarkEnabled
在使用UseParNewGC 的情况下, 尽量减少mark 的时间,降低标记停顿
(13)-XX:+UseCMSCompactAtFullCollection
在使用concurrent gc 的情况下, 防止 memoryfragmention, 对live object 进行整理, 使 memory 碎片减少。
(14)-XX:LargePageSizeInBytes
指定 Java heap的分页页面大小
(15)-XX:+UseFastAccessorMethods
get,set 方法转成本地代码
(16)-XX:+UseCMSInitiatingOccupancyOnly
指示只有在 old generation 在使用了初始化的比例后concurrent collector 启动收集
(17)-Djava.awt.headless=true
这个参数一般我们都是放在最后使用的,这全参数的作用是这样的,有时我们会在我们的J2EE工程中使用一些图表工具如:jfreechart,用于在web网页输出GIF/JPG等流,
(11)-XX:+UseParNewGC
对年轻代采用多线程并行回收,这样收得快
(12)-XX:+CMSParallelRemarkEnabled
在使用UseParNewGC 的情况下, 尽量减少mark 的时间,降低标记停顿
(13)-XX:+UseCMSCompactAtFullCollection
在使用concurrent gc 的情况下, 防止 memoryfragmention, 对live object 进行整理, 使 memory 碎片减少。
(14)-XX:LargePageSizeInBytes
指定 Java heap的分页页面大小
(15)-XX:+UseFastAccessorMethods
get,set 方法转成本地代码
(16)-XX:+UseCMSInitiatingOccupancyOnly
指示只有在 old generation 在使用了初始化的比例后concurrent collector 启动收集
(17)-Djava.awt.headless=true
这个参数一般我们都是放在最后使用的,这全参数的作用是这样的,有时我们会在我们的J2EE工程中使用一些图表工具如:jfreechart,用于在web网页输出GIF/JPG等流,
在winodws环境下,一般我们的app server在输出图形时不会碰到什么问题,但是在linux/unix环境下经常会碰到一个exception导致你在winodws开发环境下图片显示的好好可是在linux/unix下却显示不出来,因此加上这个参数以免避这样的情况出现。