当前位置: 首页 > 科技观察

Tomcat优化大全,进来看了,真就会了

时间:2023-03-11 23:45:18 科技观察

Tomcat优化百科,进来一看,你就真的知道它是JSP程序的首选。相信大家对Tomcat已经非常熟悉了。本文将介绍Tomcat的常见优化。那么为什么要优化tomcat。因为Tomcat的默认参数是针对开发环境设置的,不适合生产环境,尤其是内存和线程配置,默认很低,容易成为性能瓶颈。相信看完这篇博客,你会有所收获。Tomcat连接器协议通过三种方式优化了Tomcat连接器:bio、nio和apr。三种方法的性能差别很大。apr的性能最好,bio的性能最差。Tomcat7使用的Connector默认开启Apr协议,但是需要在系统中安装Apr库,否则会使用bio方式。如何配置nio进入tomcat的server.xml中查找connector。只需更改其中的协议属性即可。如何配置aprapr的配置需要安装,依赖yum-yinstallopenssl-develyum-yinstallapr-devel。安装完成后,去tomcat官网下载native组件。Native可以看作是tomcat和apr交互的中间环节。下载地址为:http://tomcat.apache.org/download-native.cgi在这里下载最新版本1.2.10,解压安装tar-xvzftomcat-native-1.2.10-src.tar.gzcdtomcat-native-1.2.10-src/native/./configure至此apr安装成功,进入server.xml。更改协议将默认协议="HTTP/1.1"更改为协议="org.apache.coyote.http11.Http11AprProtocol"。Tomcat配置文件的优化配置文件是我们主要的tomcat优化。我们将常见的优化直接放在配置文件中。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":压缩type,指定压缩的文件类型。支持的最大请求数。超过请求数的连接也会被关闭,1表示禁用,-1表示不限数量,默认100,一般设置在100到200之间。compression="on"为无限超时。maxkeepaliverequests="1"time,-1=""connectiontimeout="30000"保持连接多长时间,默认使用=""长连接的最大保持时间(毫秒),表示在下一个请求到来之前,tomcat=""指定当所有可用于处理请求的线程都被使用时,将不处理传入的连接请求的最大队列长度。默认为100。keepalivetimeout="120000"上传超时时间,毕竟文件上传可能需要更多的时间,这个可以根据自己的业务需要进行调整,让servlet有更长的时间来完成它的执行,需要要和前面的参数一起使用只有一起使用才会生效。acceptcount="300"上传时是否使用超时机制。connectionuploadtimeout="150000"错误。disableuploadtimeout="false"false,如果设置为false,则直接返回ip地址,为提高处理能力,应设置为=""或=""是否反向域名返回远程主机的主机名,取值为:true=""毫秒,enablelookups="false"30000=""可根据实际检测情况适当修改。意思是永远不会超时,这个设置是有隐患的。通常可以设置为=""0=""网络连接超时时间,单位:毫秒,设置为=""uriencoding="UTF-8"protocol="HTTP/1.1"port="8080"executor="tomcatThreadPool">Tomcat针对jvm优化,找到catalina.sh,在文件开头添加如下设置:JAVA_OPTS='-Xms256m-Xmx512m'-Xms:表示Java初始化堆的大小,设置了-Xms和-Xmx为相同的值以避免JVM重复重新申请内存,导致性能波动,默认值为物理内存的1/64,默认(MinHeapFreeRatio参数可以调整)当空闲堆内存小于40%时,JVM将增加堆,直到达到-Xmx的最大限制。-Xmx:表示最大Java堆大小。当应用程序需要的内存超过堆的最大值时,虚拟机会提示内存溢出,导致应用程序服务崩溃。因此,一般建议将heap的最大值设置为可用内存最大值的80%。如何知道我的JVM可以使用最大值,使用java-Xmx512M-version命令测试,然后逐渐增加512的值,如果执行正常说明指定的内存大小可用,否则一个会打印错误信息,默认值是物理内存的1/4,默认(MinHeapFreeRatio参数可以调整)当空闲堆内存大于70%时,JVM会减少堆直到最小限制-Xms。-Xss:表示每个Java线程的堆栈大小。JDK5.0之后每个线程的栈大小为1M,之前每个线程的栈大小为256K。根据应用线程需要的内存大小进行调整。在相同的物理内存下,减小这个值可以产生更多的线程,但是操作系统对一个进程的线程数还是有限制的,不能无限产生。经验值在3000~5000左右。一般对于小型应用,如果栈不是很深,128K应该就够了。对于大型应用程序,建议使用256K或512K。一般不容易设置超过1M,否则容易出现内存不足。该选项对性能影响比较大,需要严格测试。-XX:NewSize:设置新生代的内存大小。-XX:MaxNewSize:设置最大新生代内存大小-XX:PermSize:设置永久代内存大小-XX:MaxPermSize:设置最大永久代内存大小,永久代不属于堆内存,堆内存只包括新生代和老年代。-XX:+AggressiveOpts:顾名思义(aggressive),如果启用这个参数,每当JDK版本升级时,你的JVM都会使用新加入的优化技术(如果有的话)。-XX:+UseBiasedLocking:启用一个优化的线程锁,我们知道在我们的appserver中,每个http请求都是一个线程,有的请求短有的长,会出现请求排队的现象,甚至会出现线程阻塞,这种优化的线程锁可以在您的应用程序服务器中自动优化分配线程处理。-XX:+UseConcMarkSweepGC:设置老年代为并发收集,即CMSgc。此功能仅在jdk1.5后续版本中提供。它使用gc估计触发器和堆占用触发器。我们知道频繁的GC会因为JVM的起伏而影响系统的效率。因此,使用CMSGC后,当GC数量增加时,每次GC的响应时间可以很短。比如使用CMSGC后,根据jprofiler的观察,GC被触发的次数非常多,每次GC的时间只有几毫秒。-XX:+UseParNewGC:对新生代使用多线程并行回收,这样可以快速回收。注意最新的JVM版本。当使用-XX:+UseConcMarkSweepGC时,-XX:UseParNewGC将自动启用。因此,如果不想开启年轻代的并行GC,可以通过设置-XX:-UseParNewGC来关闭。-XX:MaxTenuringThreshold:设置垃圾最大年龄。如果设置为0,新生代对象将直接进入老年代,不经过Survivor区。对于有大量老年代的应用(需要大量常驻内存的应用),可以提高效率。如果将该值设置为较大的值,新生代对象会在Survivor区被多次复制,可以增加对象在新生代中的存活时间,增加在新生代中被回收的概率,并且降低FullGC的频率,一定程度上可以提高服务的稳定性。此参数仅在串行GC期间有效。该值的设置是本地jprofiler监控后得到的一个理想值,不能一概而论,照搬原样。-XX:+UseCMSCompactAtFullCollection:在并发gc的情况下,防止内存碎片,组织存活对象,减少内存碎片。-XX:+UseFastAccessorMethods:使用get和set方法转换为本地代码,原始类型的快速优化。-Djava.awt.headless=true:这个参数一般用在最后。这个完整参数的作用如下。有时候我们会在我们的J2EE项目中使用一些图表工具比如jfreechart来为网页输出GIF/JPG等流。在winodws环境下,一般我们的app服务器在输出图形的时候不会遇到什么问题,但是在linux/unix环境下,经常会遇到异常,导致你在winodws开发环境下运行。图片显示的很好,但是在linux/unix下无法显示,所以加了这个参数来避免这种情况。-Xmn:新生代的内存空间大小,注意:这里的大小是(eden+2survivorspace)。它不同于jmap-heap中显示的Newgen。整个堆大小=新生代大小+老年代大小+永久代大小。在堆大小不变的情况下,增加新生代后,会减小老年代的大小。这个值对系统性能影响很大,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)是单一的-byteencodingcompatiblewithASCII并且它使用单个字节内的所有空间,因此Tomcat认为您传递了3个以ISO-8859-1字符集编码的字符,然后它以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