频繁的Full GC的问题排查

Full GC没有明确的官方定义,有人认为需要对JVM能够用到的所有共享内存(堆、元空间/永久代、直接内存)进行GC才是Full GC;有人认为只要对整个堆进行了GC(新生代GC+老年代GC)就算是Full GC。在jatat命令的输出中,FGC表示老年代GC,个人倾向于第二种说法。

可能触发Full GC的原因

  1. 显示调用了System.gc()。
  2. 老年代空间不足。Minor GC(新生代的GC)时空间分配担保失败,新生代对象晋级老年代,大对象分配空间等情况。如果Full GC后空间仍然不足,则抛出错误:java.lang.OutOfMemoryError: Java heap space。
  3. 元空间或者永久代满了。如果经过Full GC仍然回收不了,那么JVM会抛出错误信息:java.lang.OutOfMemoryError: Meatespace/PermGen space 。
  4. 内存泄露也会导致频繁的GC。
  5. 大量的线程回收,导致GC时间很长。

问题分析定位

  1. 针对第一种情况,检查代码是否调用了System.gc()。
  2. 使用jinfo PID命令查看JVM的内存配置是否合理,使用jmap命令检查是否存在内存泄漏、大对象等。具体操作可以参考 OOM问题定位
  3. 使用jstat命令查看GC回收情况和内存使用情况。具体操作可以参考 jvm jstat 命令
  4. 动态开启GC日志打印jinfo -flag +PrintGCDetails PID,然后分析GC日志。

在JVM进程启动的时候,可以添加如下参数,方便出现问题时能及时拿到日志文件进行分析:

  1. 开启GC日志打印 -XX:+PrintGCDetails
  2. 并设置日志文件的数量 -XX:NumberOfGCLogFiles=10
  3. 设置每个日志文件的大小 -XX:GCLogFileSize=10M
  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值