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
在这里插入图片描述

posted @ 2022-05-21 23:34  小-杭  阅读(22)  评论(0编辑  收藏  举报