程序员人生 网站导航

Tomcat配置与优化(内存、并发、管理)

栏目:综合技术时间:2016-06-04 14:45:40

1、JVM内存配置优化

在开发当中,当1个项目比较大时,依赖的jar包通常比较多,我们都知道,在利用服务器启动时,会将利用援用到的所有类通过ClassLoader顺次全部加载到内存当中。Java的逻辑内存模型大致分为堆内存、栈内存、静态内存区,也称持久区,该区的内存不会被GC回收。堆内存用于存储类的实例、数组等援用类型数据,也就是用new生成的对象,都寄存在这里,栈内存存储局部变量(如:方法参数),静态内存区存储常量、静态变量、类元数据信息(方法、属性等)。开发当中常遇到的3类内存溢出异常:

  • java.lang.OutOfMemoryError: Java heap space异常
    表示堆内存空间满了,如果不是程序逻辑的bug,多是由于项目中援用的jar比较多,导到内存溢出。JVM默许堆的最小使用内存为物理内存的1/64,最大使用内存为物理内存的1/4,如8G的物理内存,JVM默许堆的最小和最大内存分别为128m和2048m。通过调剂JVM的-Xms(初始内存)和-Xmx(最大内存)两个参数加大内存使用限制。
  • java.lang.OutOfMemoryError: PermGen space异常
    表示静态内存区满了,通常是由于加载的类过量致使。jdk8以下版本通过修改JVM的-XX:PermSize和-XX:MaxPermSize两个参数,限制静态区最小和最大内存范围。jdk8改变了内存模型,将类定义寄存到了元数据(MetaspaceSize)空间,而元数据空间是与堆空间同享同1块内存区域的,所以在JDK8以后版本不会存在PermGen space异常了,故不用设置此参数。
  • java.lang.StackOverflowError异常
    表示栈内存溢出。通常是由于死循环、无穷递归致使。

修改Tomcat的内存配置,打开$TOMCAT_HOME/bin/catalina.sh文件(Windows系统是catalina.bat文件),大楖在250行左右,在JAVA_OPTS参数上添加内存参数设置便可。完全的JVM参数设置以下所示:

JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=256 -Djava.awt.headless"

-server参数:表示以服务模式启动,启动速度会略微慢1点,但性能会高很多。不加这个参数,默许是以客户端模式启动。
java.awt.headless=true参数:与图形操作有关,适用于linux系统。如生成验证码,含义是当前使用的是无显示器的服务器,利用中如果获得系统显示有关参数会抛异常,可通过jmap -heap proccess_id查看设置是不是成功。
JAVA_OPTS参数设置

2、并发配置优化

主要配置Tomcat能处理的要求数,1个进程建议最多不要超过1000个线程,表面上看线程越多处理的要求越多,其实过量的线程会占用CPU在不同线程之间切换的资源,致使CPU在每一个线程上处理的时间片极期有限,反而会下降服务器的响应性能。

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="20000" redirectPort="8443" maxThreads="500" minSpareThreads="100" acceptCount="200" maxIdleTime="30000" enableLookups="false" />

Tomcat的并发要求处理数量=maxThreads + acceptCount

protocol:启用APR连接模式,提高异步IO处理性能。启用配置请参考:《开启Tomcat APR运行模式,优化并发性能》
maxThreads:最大能接受的要求数,默许为200
minSpareThreads:线程池最小活跃线程数,默许为25
acceptCount:等待处理的要求队列,默许为100,超过队列长度,服务器则谢绝客户端要求,直接返回403
maxIdleTime:如果1个线程在30秒之内没有活跃,则终止运行并从线程池中移除。除非线程池数量小于或等于minSpareThreads数量。默许值是1分钟
enableLookups:如果为true,调用request.getRemoteHost会履行DNS反查,反向解析IP对应的域名或主机,效力较低,建议设为false。
更多参数设置,请参考Tomcat官方文档:http://tomcat.apache.org/tomcat⑻.0-doc/config/http.html

3、管理员配置

Tomcat默许没有配置管理员帐户的权限,如果要查看app的部署状态、通过管理界面deploy或undeploy,则需要在tomcat-user.xml中配置具有管理权限登录的用户。

<role rolename="tomcat"/> <role rolename="manager-gui"/> <role rolename="manager-status"/> <role rolename="manager-script"/> <role rolename="manager-jmx"/> <user username="tomcat" password="tomcat" roles="tomcat"/>

Tomcat官网配置:http://tomcat.apache.org/tomcat⑻.0-doc/manager-howto.html

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐