Tomcat参数和性能优化
1、配置文件在/usr/local/tomcat/conf/server.xml
核心标签为: Server、Service、Connector、Engine、Host和Context,其他为内嵌组件。
2、server.xml配置文件标签详解如下:
<Server> #定义Tomcat服务器,为顶级标签; <Service> #定义Tomcat服务,可包含一个Engine,多个Connecter; <Connector> #定义Tomcat连接器,定义Tomcat对外通信端口; <Engine> #表示Tomcat Service引擎,包含多个Host主机; <Host> #定义虚拟主机配置段,可包含多个Context发布目录; <Context> #定义Tomcat内容,可以定义目录、发布内容; <Valve> #定义Tomcat服务日志路径、参数、内容格式; <Realm> #定义Tomcat用户的认证和授权配置; <GlobalNamingResources> #定义Tomcat用户的认证和授权全局标签,包含Realm配置。
3、Tomcat配置文件Server.xml生产环境参数设置:
<?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <Service name="Catalina"> <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="20000" redirectPort="8443" maxThreads="4096" minSpareThreads="100" acceptCount="10000" disableUploadTimeout="true" enableLookups="false" URIEncoding="UTF-8" /> <Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>
4、Tomcat服务器性能优化
1)、Tomcat和JDK版本的选择
- JDK1.6 Tomcat6.x
- JDK1.6 Tomcat7.x
- JDK1.8 Tomcat8.x
可以使用压测工具进行测试各个组合版本的性能情况
2)、Tomcat服务器连接器的选择
Tomcat Connector(Tomcat连接器)有bio、nio、apr三种运行模式,在生产环境推荐使用nio和apr方式,从请求处理方式和操作系统级别来解决异步的IO问题,大幅度的提高性能。
3)、关闭Tomcat server.xml文件中不必要的标签和参数;
Tomcat标签有很多,通常来讲,有部分标签对于业务访问没有需求,可以删除,从而可以加快配置文件查询或者管理便捷。可以删除的标签:
- <GlobalNamingResources>
- <Realm>
- <Context>
4)、调整Tomcat WEB对连接数相关参数;
- minSpareThreads:最小空闲线程数
- maxSpareThreads:最大空闲线程数
- maxThreads:最大线程数,大并发请求时
- acceptCount:请求队列排队个数
- ConnectionTimeout:网络连接超时
5)、 调整Tomcat JVM虚拟机内存设置;
- Xmx2048M,设置Java虚拟机的堆的最大可用内存大小
- Xms2048M,设置Java虚拟机的堆的初始值内存大小
- Xmn512M,设置年轻代内存大小,一般设置为Xmx的1/4
CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib -Xms6000M -Xmx6000M -Xss512k -XX:NewSize=2250M -XX:MaxNewS ize=2250M -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicit GC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 -XX:+CMSParallelRemarkEnabled -XX:+UseC MSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupa ncyOnly -Duser.timezone=Asia/Shanghai -Djava.awt.headless=true"
6)、 关闭Tomcat DNS反查功能;
将参数设置为false,enableLookups=”false”,表示关闭DNS域名反查,提高处理能力。
5、JAVA JVM虚拟机详解
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。
JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。
如图所示JDK、JRE、JVM关系图:

如下为JVM虚拟机主要由堆、栈、本地方法栈、方法区组成,物理架构如图:

1)、堆
所有通过new创建的对象的内存都在堆中分配,堆的大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Space和To Space组成,结构图如下所示:

- 新生代,新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例
- 旧生代,用于存放新生代中经过多次垃圾回收仍然存活的对象
- 持久带,(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等。可通过-XX:PermSize和-XX:MaxPermSize来指定持久带初始化值和最大值。Permanent Space并不等同于方法区,只不过是Hotspot JVM用Permanent Space来实现方法区而已,有些虚拟机没有Permanent Space而用其他机制来实现方法区。

-Xmx:最大堆内存,如:-Xmx512m;
-Xms:初始时堆内存,如:-Xms256m;
-XX:MaxNewSize:最大年轻区内存;
-XX:NewSize:初始时年轻区内存.通常为 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + 1 个 Survivor,即 90%;
-XX:MaxPermSize:最大持久带内存;
-XX:PermSize:初始时持久带内存;
-XX:+PrintGCDetails。打印 GC 信息;
-XX:NewRatio 新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3;
-XX:SurvivorRatio 新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10。
2)、栈
每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。
-xss:设置每个线程的堆栈大小. JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话, 1M 是绝对够用了的。
3)、本地方法栈
用于支持native方法的执行,存储了每个native方法调用的状态
4)、方法区
存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。