起因
上周下午,正当我准备早早下班的时候,收到了一条报警信息,XX机器的XX服务不可用,按照运维操作步骤,先把服务恢复再说,由于服务是高可用,对业务没有影响,但是还是要找出出现问题的原因,避免下次再出现。按照之前的文档处理完重启之后,需要花点时间定位一下为什么进程会退出。
日志
首先,关注是日志,在日志中,出现了下面的信息
java.lang.OutOfMemoryError: GC overhaed limit exceeded .
一般来说,导致OOM的有两种情况:
- 数据量增加,导致的堆的空间不够
- 内存泄漏,对象没有及时回收。
GC overhaed limit exceeded 一般出现的原因就是程序把JVM的内存都耗尽了,GC花费了太多的时间来回收内存,当JVM耗费了90%以上的时间却回收不回来2%的空间的时候,就会抛出这个异常。
从这里就可以知道,我们的程序里面存在没有办法回收的内存,那么是什么?
HeapDump 文件
我们的JVM程序在启动的时候,通过以下参数设置了如果出现OOM的时候就把异常dump出来。
-XX:HeapDumpOnOutOfMemeryEr