Tomcat生产环境的性能调优

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, 表示不限制建立客户连接的时间

以上仅是工作中遇到的优化的方案,对应单一服务来说不管怎么优化总是有性能瓶颈的。

-------------已经触及底线 感谢您的阅读-------------
原文地址:https://www.cnblogs.com/cnsyear/p/12790932.html