tomcat 优化

Tomcat启动行参数的优化:
JDK版本1.8,tomcat 9.0.12
Tomcat 的启动参数位于tomcat的安装目录\bin目录下,Linux操作系统就是catalina.sh文件,Windows操作系统就是catalina.bat文件。打开该文件,在该文件头部注释(linux用#来注释,windows用rem来注释)结束的地方的下一行加上如下信息:
linux:

JAVA_OPTS="-server -Xms1g -Xmx1g -Xmn500m -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "

windows下:

set JAVA_OPTS="-server  -Xms1g -Xmx1g -Xmn500m -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true"

上面参数后的值是需要根据自己的实际情况来设置
-server
只要tomcat是运行在生产环境中的,这个参数必须加上
tomcat默认是以 –client的模式来运行的,server即意味着你的tomcat是以真实的production的模式在运行的,这也就意味着tomcat以server模式运行时将拥有:更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量。。。

-Xms–Xmx
即JVM内存设置了,把Xms与Xmx两个值设成一样是最优的做法,
可以使用如下命令查看JVM所支持的最大内存:java -Xms4096m -version

java -Xms40960m -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

说明可以支持 40960m这么大的内存,当然你可以改的更大,只要运行不出错就行。在设这个-Xms与-Xmx值时记得要先这样测试一下,要不值过大,tomcat就起不来。

–Xmn

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

-Xss

是指设定每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K,这个要根据应用的线程所需内存大小进行调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。一般小的应用,如果栈不是很深, 128k应该够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:“-Xss is translated in a VM flag named ThreadStackSize”,一般设置这个值就可以了。一般不易设置超过1M,要不然容易出现OOM。

-XX:+AggressiveOpts

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

-XX:+UseBiasedLocking

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

-XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M
JDK1.8之前是 -XX:PermSize=128M -XX:MaxPermSize=256M

-XX:+DisableExplicitGC
在程序代码中不允许有显示的调用”System.gc()”。

-XX:+UseParNewGC
对年轻代采用多线程并行回收,这样收得快。

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

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

-XX:+CMSParallelRemarkEnabled
在使用UseParNewGC 的情况下, 尽量减少 mark 的时间。

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

-XX:LargePageSizeInBytes
指定 Java heap的分页页面大小

-XX:+UseFastAccessorMethods
get,set 方法转成本地代码

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

-XX:CMSInitiatingOccupancyFraction=70
CMSInitiatingOccupancyFraction,这个参数设置有很大技巧,基本上满足(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn就不会出现promotion failed。CMSInitiatingOccupancyFraction=70说明年老代到70%满的时候开始执行对年老代的并发垃圾回收(CMS),这时还 剩30%的空间是(Xmx-Xmn)*30%兆,所以即使Xmn(也就是年轻代共512兆),只要满 足上面的公式,就不会出现垃圾回收时的promotion failed;
因此这个参数的设置必须与Xmn关联在一起。

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

16G内存 JDK8 生产服务器配置未验证,先丢完整配置
JAVA_OPTS=”-server -Xmx4g -Xms4g -Xmn256m -Xss512k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Duser.timezone=GMT+8”

-server//服务器模式
-Xmx4g //JVM最大允许分配的堆内存,按需分配
-Xms4g //JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次gc后JVM重新分配内存。
-Xmn256m //年轻代内存大小,整个JVM内存=年轻代 + 年老代 + 持久代
-Xss512k //设置每个线程的堆栈大小
-XX:+DisableExplicitGC //忽略手动调用GC, System.gc()的调用就会变成一个空调用,完全不触发GC
-XX:+UseConcMarkSweepGC //并发标记清除(CMS)收集器
-XX:+CMSParallelRemarkEnabled //降低标记停顿
-XX:LargePageSizeInBytes=128m //内存页的大小
-XX:+UseFastAccessorMethods //原始类型的快速优化
-XX:+UseCMSInitiatingOccupancyOnly //使用手动定义初始化定义开始CMS收集
-XX:CMSInitiatingOccupancyFraction=70 //使用cms作为垃圾回收使用70%后开始CMS收集
-Duser.timezone=GMT+8 //设定GMT区域,避免CentOS坑爹的时区设置

参考http://developer.51cto.com/art/201507/486162.htm

根据运行环境去掉了
-XX:PermSize
-XX:+UseCMSCompactAtFullCollection

Tomcat容器内的优化
打开tomcat安装目录\conf\server.xml文件,定位到这一行:

<Connector port="8080" protocol="HTTP/1.1"

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

<Connector port="8080" protocol="HTTP/1.1"
          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

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

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

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

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

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

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

maxProcessors与minProcessors
在 Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最 大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。
通常Windows是1000个左右,Linux是2000个左右。

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

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

compression="on" compressionMinSize="2048"             
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩。
1)compression=”on” 打开压缩功能
2)compressionMinSize=”2048” 启用压缩的输出内容大小,这里面默认为2KB
3)noCompressionUserAgents=”gozilla, traviata” 对于以下的浏览器,不启用压缩
4)compressableMimeType=”text/html,text/xml” 压缩类型

如果使用https协议的话,需要作同样的配置。

参考:https://blog.csdn.net/u011381576/article/details/79635867
https://blog.csdn.net/lifetragedy/article/details/7708724
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值