0%

OOM问题解决

OOM问题解决

  • 先要找到问题是出在堆空间还是元空间,根据爆出来的异常信息就知道了,元空间爆出来的是java.lang.OutOfMemoryError:Metaspace,如果是堆内存不足则是java.lang.OutOfMemoryError:Java heap space
  • 使用 jstat -gcutil pid 5查看当前GC的状态
  • 使用jmap -histo:live pid统计存活对象的分布情况,从高到低查看占据内存最多的对象
  • 使用jmap -dump:live,format=b,file=heap.bin <pid> dump快照
  • 然后通过分析工具来对dump出来的快照进行分析,来看是内存泄漏还是内存溢出
  • 如果是内存泄漏,使用工具查看内存泄漏对象到GC Roots的引用链,找到泄漏对象是通过怎样的路径与GC Roots相关联并导致垃圾回收器无法自动回收,定位出泄漏代码的位置
  • 如果不是内存泄漏,那就说明内存中的对象都必须存活着,就只能适当的调虚拟机参数了(-Xms和-Xmx)
  • 在检查一下是不是有某些对象的生命周期过长(不必要的静态调整为非静态,方法外定义的看看可不可以移到方法内),尝试减少程序运行期的内存消耗

还有一种情况是 GC overhead limit exceeded,这是达到了GC的开销限制

满足下列所有条件时会抛出该错误

  • 花在Full GC上的时间超出了-XX:GCTimeLimit指定的时间,默认是98,也就是98%的时间花在了GC上
  • 一次Full GC回收的内存量少于-XX:GCHeapFreeLimit设置的值,默认是2,表示Full GC期间释放的内存不足堆的2%
  • 上面两个条件连续5次Full GC都满足
  • 设置了-XX:+UseGCOverheadLimit,默认设置

欢迎关注我的其它发布渠道