线上出现 OOM 怎样排查?
先自己想一想,再看参考要点
参考要点
- 先看错误信息判断是哪块内存:Java heap space、GC overhead limit exceeded、Metaspace、direct buffer memory、unable to create native thread
- 元空间、直接内存、线程创建失败分别检查类的生成与卸载、堆外内存的释放、线程数和容器的限制,不能靠增大堆解决
- Java heap space 时,启动时加 -XX:+HeapDumpOnOutOfMemoryError 保存堆转储,或用 jcmd \<pid> GC.heap_dump 导出
- 用 MAT 按 Retained Heap 排序,查看大对象到 GC Roots 的引用链
- 引用链不该存在就是内存泄漏,改代码,否则增大堆或减少一次加载的数据