Full gc频繁如何解决,遇到OOM问题如何排查

Full GC

触发Full gc的表现形式

  • CPU满载告警
  • API响应时间过长
  • 内存反复波动
  • fullgc告警

常用的排查命令

jps: 查看本机java进程
jstack: 打印线程的栈信息,制作线程dump文件
jmap:打印内存映射信息,制作堆dump文件
jstat:性能监控工具
jhat:内存分析工具,用于解析堆dump文件并以适合人阅读的方式展示出来
jconsole: 简易的jvm可视化工具

Full gc发生的原因

  • System.gc() 方法调用
  • 老年代空间不足,新生代对象转入以及创建为大对象、大数组时候。如果Full gc后空间仍然不足,则抛出错误: java.lang.oom。
  • 永久代/元空间满了,存放class信息,当需要加载的类,反射的类和调用方法较多时候,未采用CMS GC 情况下执行Full gc。可以采用增大永久代方法

解决方法

1.如果每次gc之后剩余空间不大,说明有一部分顽固对象一直没有办法回收,导致可用内存变少,这种情况下容易oom
2.每次gc之后,剩余空间比较大,意味大部分对象都被清理了,但是系统又频繁gc,说明老年代涌入大量对象,新生代可能设置过小

oom排查

  1. 先查看启动参数是否有问题
  2. 内存快照分析:启动时候加入参数:HeapDumpOnOutOfMemoryError
  3. 然后使用memoryAnalyzer/jvisualvm分析

原因:
创建大对象/大数组
大量查询未分页
死循环

你可能感兴趣的:(java,开发语言)