你还不懂 Tomcat 的优化吗?

前言

Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场所下被普遍使用,是开发和调试Servlet、JSP 程序的首选。信赖人人对于 Tomcat 已经是异常熟悉了,本篇将先容tomcat的常见优化。那么为什么要对tomcat举行优化呢。由于Tomcat默认参数是为开发环境制订,而非适合生产环境,尤其是内存和线程的设置,默认都很低,容易成为性能瓶颈。信赖人人看完这篇博客,会有一定的收获。
你还不懂 Tomcat 的优化吗?

Tomcat毗邻器协议优化

Tomcat 毗邻器的三种方式: bio、nio 和 apr,三种方式性能差异很大,apr 的性能最优, bio 的性能最差。而 Tomcat 7 使用的 Connector 默认就启用的 Apr 协议,但需要系统安装 Apr 库,否则就会使用 bio 方式。

nio若何设置

进入到tomcat的server.xml找到connector。更改其中的protocol属性即可。
你还不懂 Tomcat 的优化吗?

apr若何设置

apr的设置需要安装依赖

yum -y install openssl-devel
yum -y install apr-devel

安装之后,去tomcat官网下载native组件,native可以看成是tomcat和apr交互的中间环节,下载地址是:http://tomcat.apache.org/download-native.cgi 这里下载最新的版本1.2.10
解压并安装

tar -xvzf tomcat-native-1.2.10-src.tar.gz
cd tomcat-native-1.2.10-src/native/
./configure

至此apr安装乐成,进入server.xml。更改协议将默认的protocol=”HTTP/1.1″修改为protocol=”org.apache.coyote.http11.Http11AprProtocol”。

Tomcat设置文件方面的优化

设置文件方面是我们主要的tomcat优化的地方。我们将常见的优化直接在设置文件中放置。
1、connectionTimeout=”30000″:网络毗邻超时,单元:毫秒,设置为 0 示意永不超时,这样设置有隐患的。通常可设置为 30000 毫秒,可凭据检测实际情形,适当修改
2、enableLookups=”false”:是否反查域名,以返回远程主机的主机名,取值为:true 或 false,若是设置为false,则直接返回IP地址,为了提高处置能力,应设置为 false。
3、disableUploadTimeout=”false”:上传时是否使用超时机制。
4、connectionUploadTimeout=”150000″:上传超时时间,究竟文件上传可能需要消耗更多的时间,这个凭据你自己的营业需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。
5、acceptCount=”300″:指定当所有可以使用的处置请求的线程数都被使用时,可传入毗邻请求的最大行列长度,跨越这个数的请求将不予处置,默以为100个。
6、keepAliveTimeout=”120000″:长毗邻最大保持时间(毫秒),示意在下次请求过来之前,Tomcat 保持该毗邻多久,默认是使用 connectionTimeout 时间,-1 为不限制超时。
7、maxKeepAliveRequests=”1″:示意在服务器关闭之前,该毗邻最大支持的请求数。跨越该请求数的毗邻也将被关闭,1示意禁用,-1示意不限制个数,默认100个,一样平常设置在100~200之间。
8、compression=”on”:是否对响应的数据举行 GZIP 压缩,off:示意克制压缩;on:示意允许压缩(文本将被压缩)、force:示意所有情形下都举行压缩,默认值为off,压缩数据后可以有用的削减页面的巨细,一样平常可以减小1/3左右,节约带宽。
9、compressionMinSize=”2048″:示意压缩响应的最小值,只有当响应报文巨细大于这个值的时刻才会对报文举行压缩,若是开启了压缩功效,默认值就是2048。
10、compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png”:压缩类型,指定对哪些类型的文件举行数据压缩。

<Connector executor="tomcatThreadPool"
 
port="8080" protocol="HTTP/1.1"
 
URIEncoding="UTF-8"
 
connectionTimeout="30000"
 //网络毗邻超时,单元:毫秒,设置为 0 示意永不超时,这样设置有隐患的。通常可设置为 30000 毫秒,可凭据检测实际情形,适当修改

enableLookups="false"
//是否反查域名,以返回远程主机的主机名,取值为:true 或 false,若是设置为false,则直接返回IP地址,为了提高处置能力,应设置为 false。
 
disableUploadTimeout="false"
//上传时是否使用超时机制。

connectionUploadTimeout="150000"
//上传超时时间,究竟文件上传可能需要消耗更多的时间,这个凭据你自己的营业需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。
 
acceptCount="300"
//指定当所有可以使用的处置请求的线程数都被使用时,可传入毗邻请求的最大行列长度,跨越这个数的请求将不予处置,默以为100个。
 
keepAliveTimeout="120000"
//长毗邻最大保持时间(毫秒),示意在下次请求过来之前,Tomcat 保持该毗邻多久,默认是使用 connectionTimeout 时间,-1 为不限制超时。
 
maxKeepAliveRequests="1"
//示意在服务器关闭之前,该毗邻最大支持的请求数。跨越该请求数的毗邻也将被关闭,1示意禁用,-1示意不限制个数,默认100个,一样平常设置在100~200之间。
 
compression="on"
//是否对响应的数据举行 GZIP 压缩,off:示意克制压缩;on:示意允许压缩(文本将被压缩)、force:示意所有情形下都举行压缩,默认值为off,压缩数据后可以有用的削减页面的巨细,一样平常可以减小1/3左右,节约带宽。
 
compressionMinSize="2048"
//示意压缩响应的最小值,只有当响应报文巨细大于这个值的时刻才会对报文举行压缩,若是开启了压缩功效,默认值就是2048。
 
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png"
//压缩类型,指定对哪些类型的文件举行数据压缩。
 
redirectPort="8443" />

Tomcat的jvm方面的优化

找到catalina.sh在文件开头增添如下设置:JAVA_OPTS=’-Xms256m-Xmx512m’

-Xms:示意 Java 初始化堆的巨细,-Xms 与-Xmx 设成一样的值,制止 JVM 频频重新申请内存,导致性能大起大落,默认值为物理内存的 1/64,默认(MinHeapFreeRatio参数可以调整)空余堆内存小于 40% 时,JVM 就会增大堆直到 -Xmx 的最大限制。

-Xmx:示意最大 Java 堆巨细,当应用程序需要的内存超出堆的最大值时虚拟机就会提醒内存溢出,而且导致应用服务溃逃,因此一样平常建议堆的最大值设置为可用内存的最大值的80%。若何知道我的 JVM 能够使用最大值,使用 java -Xmx512M -version 下令来举行测试,然后逐渐的增大 512 的值,若是执行正常就示意指定的内存巨细可用,否则会打印错误信息,默认值为物理内存的 1/4,默认(MinHeapFreeRatio参数可以调整)空余堆内存大于 70% 时,JVM 会削减堆直到-Xms 的最小限制。

-Xss:示意每个 Java 线程客栈巨细,JDK 5.0 以后每个线程客栈巨细为 1M,以前每个线程客栈巨细为 256K。凭据应用的线程所需内存巨细举行调整,在相同物理内存下,减小这个值能天生更多的线程,然则操作系统对一个历程内的线程数照样有限制的,不能无限天生,经验值在 3000~5000 左右。一样平常小的应用, 若是栈不是很深, 应该是128k 够用的,大的应用建议使用 256k 或 512K,一样平常不易设置跨越 1M,要不然容易泛起out ofmemory。这个选项对性能影响比较大,需要严酷的测试。

-XX:NewSize:设置新生代内存巨细。

-XX:MaxNewSize:设置最大新生代新生代内存巨细

-XX:PermSize:设置持久代内存巨细

-XX:MaxPermSize:设置最大值持久代内存巨细,永远代不属于堆内存,堆内存只包罗新生代和老年月。

-XX:+AggressiveOpts:作用如其名(aggressive),启用这个参数,则每当 JDK 版本升级时,你的 JVM 都市使用最新加入的优化手艺(若是有的话)。

-XX:+UseBiasedLocking:启用一个优化了的线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的征象,甚至还会泛起线程壅闭,这个优化了的线程锁使得你的appserver内对线程处置自动举行最优调配。

-XX:+UseConcMarkSweepGC:设置年迈代为并发网络,即 CMS gc,这一特征只有 jdk1.5
后续版本才具有的功效,它使用的是 gc 估算触发和 heap 占用触发。我们知道频频仍的 GC 会造面 JVM
的大起大落从而影响到系统的效率,因此使用了 CMS GC 后可以在 GC 次数增多的情形下,每次 GC 的响应时间却很短,比如说使用了 CMS
GC 后经由 jprofiler 的考察,GC 被触发次数异常多,而每次 GC 耗时仅为几毫秒。

-XX:+UseParNewGC:对新生代接纳多线程并行接纳,这样收得快,注重最新的 JVM 版本,当使用 -XX:+UseConcMarkSweepGC 时,-XX:UseParNewGC 会自动开启。因此,若是年轻代的并行 GC 不想开启,可以通过设置 -XX:-UseParNewGC 来关掉。

【面经分享】互联网寒冬,7面阿里,终获Offer,定级P6+

-XX:MaxTenuringThreshold:设置垃圾最大岁数。若是设置为0的话,则新生代工具不经由 Survivor 区,直接进入老年月。对于老年月比较多的应用(需要大量常驻内存的应用),可以提高效率。若是将此值设置为一 个较大值,则新生代工具会在 Survivor 区举行多次复制,这样可以增添工具在新生代的存活时间,增添在新生代即被接纳的概率,削减Full GC的频率,这样做可以在某种程度上提高服务稳定性。该参数只有在串行 GC 时才有用,这个值的设置是凭据内陆的 jprofiler 监控后获得的一个理想的值,不能一概而论原搬照抄。

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

-XX:+UseFastAccessorMethods:使用 get,set 方式转成内陆代码,原始类型的快速优化。

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

-Xmn:新生代的内存空间巨细,注重:此处的巨细是(eden+ 2 survivor space)。与 jmap -heap 中显示的 New gen 是差别的。整个堆巨细 = 新生代巨细 + 老生代巨细 + 永远代巨细。在保证堆巨细稳定的情形下,增大新生代后,将会减小老生代巨细。此值对系统性能影响较大,Sun官方推荐设置为整个堆的 3/8。

-XX:NewRatio:年轻代(包罗 Eden 和两个 Survivor 区)与年迈代的比值(除去持久代),-XX:NewRatio=4 示意年轻代与年迈代所占比值为 1:4,年轻代占整个客栈的 1/5,Xms=Xmx 而且设置了 Xmn 的情形下,该参数不需要举行设置。

-XX:SurvivorRatio:Eden 区与 Survivor 区的巨细比值,设置为 8,示意 2 个 Survivor 区(JVM 堆内存年轻代中默认有 2 个巨细相等的 Survivor 区)与 1 个 Eden 区的比值为 2:8,即 1 个 Survivor 区占整个年轻代巨细的 1/10。

-XX:+UseSerialGC:设置串行网络器。

-XX:+UseParallelGC:设置为并行网络器。此设置仅对年轻代有用。即年轻代使用并行网络,而年迈代仍使用串行网络。

-XX:+UseParallelOldGC:设置年迈代垃圾网络方式为并行网络,JDK6.0 最先支持对年迈代并行网络。

-XX:OldSize:设置 JVM 启动分配的老年月内存巨细,类似于新生代内存的初始巨细 -XX:NewSize。

Tomcat的字符集设置优化

Tomcat 的语言编码,设置起来很慢,要经由多次设置才可以了,否则中文很有可能泛起乱码情形。譬如汉字“中”,以 UTF-8 编码后获得的是 3 字节的值 %E4%B8%AD,然后通过 GET 或者 POST 方式把这 3 个字节提交到 Tomcat 容器,若是你不告诉 Tomcat 我的参数是用 UTF-8编码的,那么 Tomcat 就以为你是用 ISO-8859-1 来编码的,而 ISO8859-1(兼容 URI 中的尺度字符集 US-ASCII)是兼容 ASCII 的单字节编码而且使用了单字节内的所有空间,因此 Tomcat 就以为你通报的用 ISO-8859-1 字符集编码过的 3 个字符,然后它就用 ISO-8859-1 来解码。

设置起来不难使用“ -D<名称>=<值> ”来设置系统属性:

-Djavax.servlet.request.encoding=UTF-8

-Djavax.servlet.response.encoding=UTF-8

-Dfile.encoding=UTF-8

-Duser.country=CN

-Duser.language=zh

总结

Tomcat优化到此结束,你现在懂了吗?文中难免有不足,迎接批评指正。
你还不懂 Tomcat 的优化吗?

原创文章,作者:7h28新闻网,如若转载,请注明出处:https://www.7h28.com/archives/11343.html