第一种 - 提高JVM栈内存
第二种 - 解决JRE内存泄露
内存泄漏往往会影响性能表现,我们使用tomcat版本6.0.26及以上版本就可以解决这个问题,因为它包含了一个监听器来处理JRE和PermGen的内存泄漏。使用的监听器是,
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
第三种 – 线程池设置
线程池指定Web请求负载的数量,因此,为获得更好的性能这部分应小心处理。可以通过调整连接器属性“maxThreads”完成设置。maxThreads的值应该根据流量的大小,如果值过低,将有没有足够的线程来处理所有的请求,请求将进入等待状态,只有当一个的处理线程释放后才被处理;如果设置的太大,Tomcat的启动将花费更多时间。因此它取决于我们给maxThreads设置一个正确的值。
我们可以修改Tomcat默认配置来提高线程处理能力。apache-tomcat-7.0.42-windows-x64其默认配置
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/>
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改后
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="250" minSpareThreads="4" maxHttpHeaderSize="8192" /> <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" enableLookups="false" acceptCount="100" disableUploadTimeout="true"/>
在上述配置中,maxThreads值设定为“250”,这指定可以由服务器处理的并发请求的最大数量。任何多出的并发请求将收到“拒绝连接”的错误提示,直到另一个处理请求进程被释放。错误看起来如下,
org.apache.tomcat.util.threads.ThreadPool logFull SEVERE: All threads (250) are currently busy, waiting. Increase maxThreads (250) or check the servlet status
如果应用提示上述错误,务必检查上述错误是否是由于单个请求花费太长时间造成的,这个问题的原因是这样的,有时候如果数据库连接不释放的话,进程将不会处理其它请求。
enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名。为了提高处理能力,应设置为 false。
注意: 如果请求的数量超过了“750”,这将不是意味着将maxThreads属性值设置为“750”,它意外着最好使用“Tomcat集群”的多个实例。也就是说,如果有“1000”请求,两个Tomcat实例设置“maxThreads= 500”,而不在单Tomcat实例的情况下设置maxThreads=1000。
第四种 - 压缩
在server.xml配置文件中设置压缩的选项。压缩可以在connector像如下设置中完成
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/plain,application/octet-stream" />
参数说明
compression 打开压缩功能
compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB
compressableMimeType 压缩类型
connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间