Tomcat内存溢出(java.lang.OutOfMemoryError: PermGen space)的问题常常会在开发中遇到,面试中也有会问到的时候,因此我决定要记一下。javascript
首先,优化tomcat我给出三个方向:css
a) 内存优化:主要是对Tomcat启动参数进行优化,咱们能够在Tomcat启动脚本中修改它的最大内存数等等。html
b) 线程数优化:Tomcat的并发链接参数,主要在Tomcat配置文件中server.xml中配置,好比修改最小空闲链接线程数,用于提升系统处理性能等等。java
c) 优化缓存:打开压缩功能,修改参数,好比压缩的输出内容大小默认为2KB,能够适当的修改。面试
针对第一点,咱们须要了解如下6个参数:数据库
1:-Xms 堆空间初始大小缓存
2:-Xmx 堆空间最大数值tomcat
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 目前我仍是有点看不大明白的,还得学习下,其中提到了线程池,我在想这和数据库链接池是应该有殊途同归之处。