您的位置:首页 > 运维架构 > Tomcat

Tomcat VM配置,解决内存溢出,分析GC日志,各参数配置解析。

2020-03-01 21:50 447 查看
  • 在IDEA或Eclipse中设置VM options :

        -Dfile.encoding=UTF-8  ----  设置编码格式,日志信息在开发工具中乱码的时候可以尝试。

        -XX:+PrintGC  ----- 输出GC日志

        -XX:+PrintGCDetails  ----- 输出GC的详细日志

        -XX:+PrintGCTimeStamps   ---- 输出GC的时间戳(以基准时间的形式)

        -XX:+PrintGCDateStamps    -----  输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)

        -XX:+PrintHeapAtGC   ----- 在进行GC的前后打印出堆的信息

         IDEA为例如下设置:

        

         重启Tomcat看一下打印的GC日志:

        

  • 刚开始的GC日志开头的“[GC(System.gc())]”和”[Full GC(System.gc())]”说明了这次垃圾收集的停顿类型,而不是用来区分新生代GC还是老年代GC的,如果是”Full”,说明这次发生了Stop-The-World的停顿(停顿了所有java线程),而GC System.gc()表示这次垃圾收集是由于执行了System.gc()产生的
  • 后面的”[PSYoungGen]”表示GC发生的区域,YoungGen自然表示是新生代区域,这里的发生区域是和GC收集器相关的,这里是“PSYoungGen”表示是Parallel Scavenge收集器,如果是ParNew收集器,将会是”[ParNew]”,如果是Serial收集器绘制”[DefNew]”意为”Default New Generation”那自然,后面的”[ParOldGen]”表示的是老年代回收

  • Metaspace是从JDK1.8出来的新概念,从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间。Metaspace使用的是本地内存,而不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存大小有关。当然你也可以通过以下的几个参数对Metaspace进行控制:

  1. -XX:MetaspaceSize=N 

    这个参数是初始化的Metaspace大小,该值越大触发Metaspace GC的时机就越晚。随着GC的到来,虚拟机会根据实际情况调控Metaspace的大小,可能增加上线也可能降低。在默认情况下,这个值大小根据不同的平台在12M到20M浮动。使用java -XX:+PrintFlagsInitial命令查看本机的初始化参数,-XX:Metaspacesize为21810376B(大约20.8M)。

  2. -XX:MaxMetaspaceSize=N 

    这个参数用于限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他程序。在本机上该参数的默认值为4294967295B(大约4096MB)。

  3. -XX:MinMetaspaceFreeRatio=N 

    当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比小于这个参数,那么虚拟机将增长Metaspace的大小。在本机该参数的默认值为40,也就是40%。设置该参数可以控制Metaspace的增长的速度,太小的值会导致Metaspace增长的缓慢,Metaspace的使用逐渐趋于饱和,可能会影响之后类的加载。而太大的值会导致Metaspace增长的过快,浪费内存。

  4. -XX:MaxMetasaceFreeRatio=N 

    当进行过Metaspace GC之后, 会计算当前Metaspace的空闲空间比,如果空闲比大于这个参数,那么虚拟机会释放Metaspace的部分空间。在本机该参数的默认值为70,也就是70%。

  5. -XX:MaxMetaspaceExpansion=N 

    Metaspace增长时的最大幅度。在本机上该参数的默认值为5452592B(大约为5MB)。

  6. -XX:MinMetaspaceExpansion=N 

    Metaspace增长时的最小幅度。在本机上该参数的默认值为340784B(大约330KB为)。

    

  •     PSYoungGen:XXXK(年轻代垃圾回收前的大小)->XXXK(年轻代垃圾回收以后的大小)(XXXK)(年轻代的总大小)] XXXK(堆区垃圾回收前的大小)->XXXK(堆区垃圾回收后的大小)(XXXK)(堆区总大小), 0.0038495  secs(回收时间)] [Times: user=0.08(Young GC用户耗时) sys=0.02(Young GC系统耗时), real=0.01 secs(Young GC实际耗时)]  
  • 各种参数配置详解

  • 解决Tomcat内存溢出只需要设置-Xms -Xmx -XX:PermSize -XX:MaxPermSize 四个参数就好,如不能解决加上设置 -XX:NewSize -XX:MaxNewSize 两个参数。参数的大小根据自己电脑配置自行调整设置;

  1. -Xms768m:设置JVM初始堆内存为768m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存
  2. -Xmx768m:设置JVM最大堆内存为768m。 
  3. -Xss128k:设置每个线程的栈大小。JDK5.0以后每个线程栈大小为1M,之前每个线程栈大小为256K。应当根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。需要注意的是:当这个值被设置的较大(例如>2MB)时将会在很大程度上降低系统的性能。 
  4. -Xmn2g:设置年轻代大小为2G。在整个堆内存大小确定的情况下,增大年轻代将会减小年老代,反之亦然。此值关系到JVM垃圾回收,对系统性能影响较大,官方推荐配置为整个堆大小的3/8。 
  5. -XX:NewSize=1024m:设置年轻代初始值为1024M。 
  6. -XX:MaxNewSize=1024m:设置年轻代最大值为1024M。
  7. -XX:PermSize=256m:设置持久代初始值为256M。
  8. -XX:MaxPermSize=256m:设置持久代最大值为256M。   
  9. -XX:NewRatio=4:设置年轻代(包括1个Eden和2个Survivor区)与年老代的比值。表示年轻代比年老代为1:4。 
  10. -XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的比值。表示2个Survivor区(JVM堆内存年轻代中默认有2个大小相等的Survivor区)与1个Eden区的比值为2:4,即1个Survivor区占整个年轻代大小的1/6。 
  11. -XX:MaxTenuringThreshold=7:表示一个对象如果在Survivor区(救助空间)移动了7次还没有被垃圾回收就进入年老代。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代,对于需要大量常驻内存的应用,这样做可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代存活时间,增加对象在年轻代被垃圾回收的概率,减少Full GC的频率,这样做可以在某种程度上提高服务稳定性。

    注:Tomcat的catalina.bat文件中和环境变量CATALINA_OPTS中也可能会设置有相关参数,如不生效可以检查这两个地方,

 

                    

 

        

        

 

 

  • 点赞
  • 收藏
  • 分享
  • 文章举报
东毒西邪℉ 发布了2 篇原创文章 · 获赞 0 · 访问量 1436 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: