Tomcat7优化

用了很久的Tomcat,没怎么看过它的优化,今天抽出时间研究了下,将内容记录下。

首先,是客户端访问tomcat的一个过程,如图所示:

图中间虚线框部分是 Apache基金下的服务器来做静态资源处理的,而这部分需要花费大量时间,当用nginx和tomcat做企业级集群的时候,需要禁用掉AJP协议。


一、准备工作:

1. 配置管理员帐户:

  进入conf目录下,打开tomcat-users.xml,在首尾元素中间加入:

此时,配置的用户名和密码都是tomcat。

2. 优化方法

  (1)在浏览器中输入 http://localhost:8080/,点击页面中 Server Status,可以看到默认tomcat中的JVM、HTTP、AJP协议、连接池是否启用等,可以通过修改页面上显

示的参数来优化tomcat。

  (2)在server.xml中进行更加深入的配置。

二、优化

1. 禁用AJP协议

  (1)通过禁用AJP协议,达到在集群的时候提高处理请求的时间。

图1

(2)启动tomcat后,不论从刚刚的管理员界面,还是从控制台上(如图1所示)都可以看出,AJP协议是开启的。

  我们要做的就是要将此协议禁用,禁用方法:在server.xml中,将  

  注释掉,重新启动tomcat,可以看出控制台上已经不存在上图 黑框中所示的。

2. 将BIO通讯模式修改为NIO通讯模式

  (1)tomcat通讯协议支持http1.0和1.1,tomcat默认走的是BIO通讯模式,tomcat7和tomcat8之所以默认的都是效率低下的BIO通讯模式,是因为和前面的就项目做兼容。

  (2)在控制台上(如图1所示)或者管理界面都可以看到,tomcat启动的通讯模式是bio的。

  (3)应用场景:tomcat集群的时候,若项目比较新,都是1.5类库之前,即JDK版本大于1.5,可将集群中每一个tomcat的启动模式设置为高并发高性能的应答模式(NIO)。

  (4)配置方法:在server.xml中 ,将 <Connector connectionTimeout="20000" port="8066" protocol="HTTP/1.1" redirectPort="8448"/> 改为:  

  其中,原来的protocol="HTTP/1.1"表示遵循http1.1协议,同时,也是一个最原始的未经优化的通信协议,

  修改之后的 protocol="org.apache.coyote.http11.Http11NioProtocol" ,表示以 NIO模式启动。

3. 启用外部连接池,来满足高并发已经复用的请求

图2

maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200。将  

  注释打开,并修改maxThreads的值,然后在<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol"/>

  中加入 executor="tomcatThreadPool",即最后为:  

根据业务场景和服务器硬件资源条件可以适当的加大线程连接池,根据第三方工具去开启并发测试来确定一个最好的连接池数。

4. 优化连接器

  最佳实践:  

5. 在tomcat中设置JVM参数

  修改bin/catalina.bat文件设置参数(注释后第一行),增加  

  -Xms:设置JVM初始内存大小(默认是物理内存的1/64)

   -Xmx:设置JVM可以使用的最大内存(默认是物理内存的1/4,建议:物理内存80%)

   -Xmn:设置JVM最小内存(128-256m就够了,一般不设置)

   默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、

-Xmx相等以避免在每次GC 后调整堆的大小。  

   在较大型的应用项目中,默认的内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误“java.lang.OutOfMemoryError:Java heap space”,从而

导致客户端显示500错误。  

  -XX:PermSize :为JVM启动时Perm的内存大小  

  -XX:MaxPermSize :为最大可占用的Perm内存大小(默认为32M) 

  -XX:MaxNewSize,默认为16M

  PermGen space的全称是Permanent Generationspace,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到

PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的

话,就很可能出现“java.lang.OutOfMemoryError:PermGen space”错误。

对于WEB项目,jvm加载类时,永久域中的对象急剧增加,从而使jvm不断调整永久域大小,为了避免调整),你可以使用更多的参数配置。如果你的WEBAPP下都用了大量的第三

方jar, 其大小超过了jvm默认的大小,那么就会产生此错误信息了。

其它参数:   -XX:NewSize :默认为2M,此值设大可调大新对象区,减少FullGC次数

  -XX:NewRatio :改变新旧空间的比例,意思是新空间的尺寸是旧空间的1/8(默认为8)

  -XX:SurvivorRatio :改变Eden对象空间和残存空间的尺寸比例,意思是Eden对象空间的尺寸比残存空间大survivorRatio+2倍(缺省值是10)

  -XX:userParNewGC 可用来设置并行收集【多CPU】

  -XX:ParallelGCThreads 可用来增加并行度【多CPU】

  -XXUseParallelGC 设置后可以使用并行清除收集器【多CPU】

本文分享自微信公众号 - Java帮帮(javahelp),作者:奋斗蒙

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-11-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 虚拟机11.JVM调优_调优方法

    虚拟机11.JVM调优_调优方法 ENTER TITLE JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自...

    Java帮帮
  • Java内存管理

    内存溢出 理论学习 问题解决 垃圾回收 问题 理论学习 垃圾回收过程 常用垃圾回收器 工具篇 GC日志 命令行工具 可视化工具 问题解决 内存溢出 首先是比较”...

    Java帮帮
  • JSP与EL表达式重点学习笔记(1)

    Jsp&el表达式 JSP指令 ? JSP指令概述 JSP指令的格式:<%@指令名 attr1=”” attr2=”” %>,一般都会把JSP指令放到JSP文件...

    Java帮帮
  • 【进阶篇】命令行参数细节描述

    编写|PaddlePaddle 排版|wangp 虽然PaddlePaddle看起来包含了众多参数,但是大部分参数是为开发者提供的,或者已经在集群提交环境中自动...

    用户1386409
  • 年中总结该怎么写?操作模板看这里

    答:半年汇报不同于年终总结。半年汇报是半途的过程性汇报,事情只办了一半。所以应该包含三个部分:

    接地气的陈老师
  • 虚拟机11.JVM调优_调优方法

    虚拟机11.JVM调优_调优方法 ENTER TITLE JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自...

    Java帮帮
  • 三句话捋清楚java垃圾收集器

    不要说jdk x默认的垃圾收集器是什么,与jdk发行版有关,同样的代码使用jdk8同一子版本测试在mac是parallel,在centos是serial。

    pollyduan
  • tomcat内存配置

    1Tomcat的JVM内存溢出解决方法 在生产环境中,tomcat内存设置不好很容易出现JVM内存溢,解决方法就是修改Tomcat中的catalina.sh文...

    用户1499526
  • 年终总结该怎么写?数据分析师特供版

    有同学问:老师,到了年终写总结的时候,就发现自己写的总结很平淡。有些在别人看起来是亮点的,自己写起来效果一般。请问下,到底要咋写?

    接地气的陈老师
  • 记一次服务cpu爆高异常

    版权声明:本文为博主原创文章,未经博主允许不得转载。 ...

    林老师带你学编程

扫码关注云+社区

领取腾讯云代金券