Tomcat内存爆炸处理
Tomcat内存爆炸处理
Tomcat启动JVM配置说明
例子:JAVA_OPTS=’-server -Xms128m -Xmx5120m -XX:PermSize=128m -XX:MaxPermSize=2048m’
所在位置:↓/usr/local/tomcat/bin/catalina.sh
- -Xms:java Heap初始大小。 默认是物理内存的1/64。128.03125
- -Xmx:java heap最大值。建议均设为物理内存的一半。不可超过物理内存。 4097
- -XX:PermSize:设定内存的永久保存区初始大小,缺省值为64M。
- -XX:MaxPermSize:设定内存的永久保存区最大 大小,缺省值为64M。
- -XX:SurvivorRatio=2:生还者池的大小,默认是2,如果垃圾回收变成了瓶颈,您可以尝试定制生成池设置16
- -XX:NewSize: 新生成的池的初始大小。 缺省值为2M。
- -XX:MaxNewSize: 新生成的池的最大大小。 缺省值为32M。新域为堆的1/4或32M:1024
- -verbose:gc 现实垃圾收集信息
- -Xloggc:gc.log 指定垃圾收集日志文件
- -Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
- -XX:+UseParNewGC :缩短minor收集的时间
- -XX:+UseConcMarkSweepGC :缩短major收集的时间 此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适。
- -XX:userParNewGC 可用来设置并行收集【多核CPU】
- -XX:ParallelGCThreads 可用来增加并行度【多核CPU】
- XX:UseParallelGC 设置后可以使用并行清除收集器【多核CPU】
- -XX:MaxNewSize=size in bytes : 允许您改变初期对象空间的上限,新建对象所需的内存就是从这个空间中分配来的,这个选项的缺省值是640K。(-server选项把缺省尺寸增加到2M。)
- -XX:NewRatio=value : 改变新旧空间的尺寸比例,这个比例的缺省值是8,意思是新空间的尺寸是旧空间的1/8。
处理方案
问题说明
linux系统,物理内存8G,后来又弄过16G的,使用上面例子中的配置,竟然在运行一段时间之后,会把内存全吃了。。。导致项目爆炸了
无法理解16G的内存也会爆炸的问题,我其实觉得8G 的内存也就够了的。多开几个Tomcat 比单个大内存的使用效能会好很多的。
方案1
JAVA_OPTS='-server -Xms512m -Xmx5120m -XX:PermSize=215m -XX:MaxPermSize=640m -XX:SurvivorRatio=16 -XX:NewSize=128m -XX:MaxNewSize=1280 -XX:NewRatio=3 -XX:ParallelGCThreads=3'
主要是新旧对象空间分配与新生成的池等一些内存的大小配置
这个方案是在16G内存的机子上使用的,完全可行,不再出现爆炸的情况了。
方案2
JAVA_OPTS='-server -Xms1024m -Xmx4096m -XX:PermSize=128m -XX:MaxPermSize=512m -XX:SurvivorRatio=16 -XX:NewSize=128m -XX:MaxNewSize=1024 -XX:NewRatio=3 -XX:ParallelGCThreads=3 -XX:+UseBiasedLocking -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseFastAccessorMethods'
这个方案在1的基础上,加上了一些并发和GC的配置。
此方案在8G内存的机子上测使用,妥妥的没问题。
Tomcat初始化配置说明
配置文件位置:↓ /usr/local/tomcat/conf/server.xml
- maxThreads=“600” ///最大线程数
- minSpareThreads=“100”///初始化时创建的线程数
- maxSpareThreads=“500”///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
- acceptCount=“700”//指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
太多。。。懒得copy下去了,需要看详细的百度谷歌都有好多的
原始默认配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="1000" minSpareThreads="25" maxSpareThreads="100" acceptCount="300" />
默认配置 没啥东东 ╮(╯_╰)╭
方案1
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" disableUploadTimeout="true" enableLookups="false"
redirectPort="8443"
maxThreads="800" minSpareThreads="130" maxSpareThreads="660" acceptCount="900"
compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
/>
此配置对线程数做了具体的配置,并且做了压缩【如果nginx上有压缩了这里可以不用,因为没啥效果】
方案2
使用 NIO模式启动 tomcat 添加线程池进行优化线程处理
。。。。
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="800" minSpareThreads="130"/>
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000" disableUploadTimeout="true" enableLookups="false"
redirectPort="8443"
maxThreads="800" minSpareThreads="130" maxSpareThreads="660" acceptCount="900"
compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
/>
。。。。
此方案在1的基础上,使用NIO模式,会使得Tomcat的响应时间缩短;使用线程池优化连接
2018-09-03
小杭 O(∩_∩)O
本文来自博客园,作者:小-杭,转载请注明原文链接:https://www.cnblogs.com/xiaohangblog/articles/16296513.html
欢迎转载小杭的博客,记得关注点赞收藏哦 (#^.^#)