Tomcat服务器优化

Tomcat内存溢出(java.lang.OutOfMemoryError: PermGen space)的问题经常会在开发中遇到,面试中也有会问到的时候,所以我决定要记一下。

首先,优化tomcat我给出三个方向:

a) 内存优化:主要是对Tomcat启动参数进行优化,我们可以在Tomcat启动脚本中修改它的最大内存数等等。

b) 线程数优化:Tomcat的并发连接参数,主要在Tomcat配置文件中server.xml中配置,比如修改最小空闲连接线程数,用于提高系统处理性能等等。

c) 优化缓存:打开压缩功能,修改参数,比如压缩的输出内容大小默认为2KB,可以适当的修改。

针对第一点,我们需要了解以下6个参数:

1:-Xms 堆空间初始大小

2:-Xmx 堆空间最大数值

3:-Xmn 年轻代的堆大小

4:-Xss   每个线程堆大小

5:-XX: PermSize 内存永久保留区域 

6:-XX:MaxPermSize 内存最大永久保留区域

这几个参数都是在Tomcat 启动脚本(bin/catalina.bat)中进行配置的,一般开发环境配置时我们就会预先配置好。只要把以下代码加入文件中,并且重启Tomcat即可。

JAVA_OPTS="-Xms2048m -Xmx2048m -Xmn1024m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=512m"(具体数值按公司服务器大小以及实际自行配置)

第二第三点合在一起优化也是修改Tomcat的配置文件server.xml。初学者一般使用这个文件都是为了修改端口号。

我们打开server.xml找到Connector 标签项,可以看到默认配置如下:

1 <Connector port="8080" protocol="HTTP/1.1"  
2            connectionTimeout="20000"  
3            redirectPort="8443" /> 

其中port代表服务端口;protocol代表协议类型;connectionTimeout代表连接超时时间,单位为毫秒;redirectPort代表安全通信(https)转发端口,一般配置成443。

我们需要调整连接器connector的并发处理能力,比如这样:

 1 <Connector port="8080"
 2   protocol="HTTP/1.1"
 3   maxHttpHeaderSize="8192"
 4   maxThreads="1000"
 5   minSpareThreads="100"
 6   maxSpareThreads="1000"
 7   minProcessors="100"
 8   maxProcessors="1000"
 9   enableLookups="false"
10   compression="on"
11   compressionMinSize="2048"
12   compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
13   connectionTimeout="20000"
14   URIEncoding="utf-8"
15   acceptCount="1000"
16   redirectPort="8443"
17   disableUploadTimeout="true"/>

参数说明:

  maxThreads 客户请求最大线程数 
  minSpareThreads Tomcat初始化时创建的 socket 线程数 
  maxSpareThreads Tomcat连接器的最大空闲 socket 线程数 
  enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名 
  redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口 
  acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads ) 
  minProcessors 服务器创建时的最小处理线程数 
  maxProcessors 服务器同时最大处理线程数 
  URIEncoding URL统一编码
  compression 打开压缩功能 
  compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB 
  compressableMimeType 压缩类型 
  connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间

推荐一篇好文章:http://blog.csdn.net/kally_wang/article/details/74989885  目前我还是有点看不大明白的,还得学习下,其中提到了线程池,我在想这和数据库连接池是应该有异曲同工之处。

原文地址:https://www.cnblogs.com/timePasser-leoli/p/8526039.html