Tomcat生产环境的性能调优
背景
java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出
工作时第一次遇见这个错误,很慌张因为客户那边网站无法访问了。出现的原因就是Tomcat配置的内存太小,访问量大的时候内存就溢出了。
天津项目考生查询会有短时间出现大量用户访问,这时就会有并发瓶颈。
Tomcat性能优化一:内存的优化
Tomcat默认可以使用的内存为128M o(╥﹏╥)o这点够干啥的!
在bin/catalina.bat或bin/catalina.sh 配置文件中进行。windows上,在catalina.bat中添加:
set JAVA_OPTS=%JAVA_OPTS% -server -Xms1024m -Xmx1024m -XX:PermSize=256M -XX:MaxNewSize=512m -XX:MaxPermSize=256m -Djava.awt.headless=true
相关参数:
- JAVA_OPTS参数说明
- -server 启用jdk 的 server 版;
- -Xms java虚拟机初始化时的最小内存;
- -Xmx java虚拟机可使用的最大内存; #-Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能大起大落
- -XX:PermSize 内存永久保留区域
- -XX:MaxPermSize 内存最大永久保留区域
- -XX:MaxNewSize 对自身堆栈的新的最大的分配;当tomcat内存不足时,调用此分配;
- -Djava.awt.headless=true 这个参数下面单独解释↓↓↓
- java.awt.headless 模式
- 什么是 java.awt.headless?Headless模式是系统的一种配置模式。在该模式下,系统缺少了显示设备、键盘或鼠标。
- 何时使用和headless mode?Headless模式虽然不是我们愿意见到的,但事实上我们却常常需要在该模式下工作,尤其是服务器端程序开发者。因为服务器(如提供Web服务的主机)往往可能缺少前述设备,但又需要使用他们提供的功能,生成相应的数据,以提供给客户端(如浏览器所在的配有相关的显示设备、键盘和鼠标的主机)。
- 如何使用和Headless mode?
一般是在程序开始激活headless模式,告诉程序,现在你要工作在Headless mode下,就不要指望硬件帮忙了,你得自力更生,依靠系统的计算能力模拟出这些特性来:
System.setProperty("java.awt.headless", "true"); - JAVA程序在浏览器中显示打印报表pdf文档时,报如下错误:
JasperReports encountered this error : Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.
或者JasperReports encountered this error : sun/awt/X11GraphicsEnvironment - 解决办法是
运行时加上-Djava.awt.headless=true
Tomcat性能优化二:并发优化
1.调整连接器connector的并发处理能力,在Tomcat 配置文件 server.xml 中的
<Connector port="9027"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="1000"
minProcessors="100"
maxProcessors="1000"
enableLookups="false"
URIEncoding="utf-8"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>
- 参数说明
- maxThreads 客户请求最大线程数
- minSpareThreads Tomcat初始化时创建的 socket 线程数
- maxSpareThreads Tomcat连接器的最大空闲 socket 线程数
- enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名
- redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
- acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )
- connectionTimeout 连接超时
- minProcessors 服务器创建时的最小处理线程数
- URIEncoding URL统一编码
2.Tomcat缓存优化
<Connector port="9027"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="1000"
minProcessors="100"
maxProcessors="1000"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"
URIEncoding="utf-8"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>
- 参数说明
- compression 打开压缩功能
- compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB
- compressableMimeType 压缩类型
- connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间
以上仅是工作中遇到的优化的方案,对应单一服务来说不管怎么优化总是有性能瓶颈的。