Contents
  1. 1. JVM调优
    1. 1.1. 选择合适的垃圾回收器
    2. 1.2. 设置合适的各个代取的大小和ratio
    3. 1.3. 垃圾回收算法的调整
  2. 2. FULL GC触发的可能情况和解决方案
    1. 2.1. System.gc()
    2. 2.2. 老年代代空间不足:
    3. 2.3. 永久代空间不足(1.8JDK不存在)
    4. 2.4. CMS GC时出现promotion failed
    5. 2.5. 统计Minor GC后进入老年代的平均大小大于老年代的可用内存
  3. 3. 频繁FULL GC报警的应对措施

JVM调优

选择合适的垃圾回收器

单线程或者2个CPU的就用serial
网站类要求最小STW的 CMS,计算类吞吐量用 Paralie

设置合适的各个代取的大小和ratio

  • 默认YGC 15次之后的对象进入老年代,可以修改
  • 默认堆区最大值是操作系统内存的1/4,可以修改并且设置初始值和最大值

垃圾回收算法的调整

CMS是标记清除的可能有碎片,设置参数FGC后压缩一次

FULL GC触发的可能情况和解决方案

System.gc()

建议JVM Full GC,但是尽量不使用此方法,让虚拟机自己去管理它的内存,可通过通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。

老年代代空间不足:

  • 新生代产生的新对象进入老年代,老年代实际空间已经满了,触发FULL GC,最常见的情况
  • 老年代采用CMS,虽然空间还有,但是都是空间碎片,不足以装下一个大的对象,也会触发FULL GC。解决方案:设置合适的参数,每多少次FULL GC进行一次压缩

永久代空间不足(1.8JDK不存在)

当系统中要加载的类、反射的类、CGLIB的类和调用的方法较多时,Permanet Generation可能会被占满,解决方案增大Perm Gen空间

CMS GC时出现promotion failed

CMS因为是并发清楚,所以Full GC进行时有很多对象进入老年代而空间又不组会触发,serialOld的方式单线程回收,STW时间长。解决方案,调大老年代的剩余空间比例

统计Minor GC后进入老年代的平均大小大于老年代的可用内存

比如第一次YGC有6M对象进入老年代,则第二次出发YGC时会检查老年代剩余空间是否大于6M,否则进行FULL GC,虽然这一次YGC的产生对象也不一定有6M

频繁FULL GC报警的应对措施

https://blog.csdn.net/wilsonpeng3/article/details/70064336

  • 利用工具检测各个带区的空间变化情况:Jconsole工具、jstat -gc -utilgc -capacity,来缩小问题的范围
  • 锁定范围时,通过 jmap -dump生成dump包,或者设置参数每次FULLGC之前生成dump包,再利用工具查看内存快照中对象情况,定位问题
  • 查看GC日志,获取更多的信息
Contents
  1. 1. JVM调优
    1. 1.1. 选择合适的垃圾回收器
    2. 1.2. 设置合适的各个代取的大小和ratio
    3. 1.3. 垃圾回收算法的调整
  2. 2. FULL GC触发的可能情况和解决方案
    1. 2.1. System.gc()
    2. 2.2. 老年代代空间不足:
    3. 2.3. 永久代空间不足(1.8JDK不存在)
    4. 2.4. CMS GC时出现promotion failed
    5. 2.5. 统计Minor GC后进入老年代的平均大小大于老年代的可用内存
  3. 3. 频繁FULL GC报警的应对措施