一次OOM的排查过程

醉酒当歌 提交于 2019-12-17 10:38:12

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

最近测试环境的Java应用经常挂掉,用jconsole查看堆内存使用情况,如下图:

堆内存使用量

在达到高峰的时候tomcat服务挂了,看图可以知道使用内存过大,于是开始追踪元凶。

  1. 加入启动参数 在catalina.sh加入-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/web/tomcat7/temp/oom.hprof 第一个参数是当发生OOM是生成heap dump文件,第二个参数是指定文件路径
  2. MAT工具分析 将生成的oom.hprof载入MAT进行分析(MAT工具下载地址:迅雷下载链接),如下图:

MAT分析图

工具怎么使用在此不讲了,参考官网wiki介绍。 点击图中Reports 下的 Leak Suspects,这里会列出了工具怀疑的内存泄露点,不过工具怀疑的也未必真的是存在的,但提供了一种参考。如下图:

怀疑的内存泄露点

图中怀疑内存泄漏点有四处,点击图中第一处的details查看详细情况,如下图:

内存泄露点1

从图中可以看到一个ArrayList有240097个对象引用没有释放掉,这才是导致OOM的原因,再查看报告中的Thread Stack,找到具体代码所在处,如下图:Thread Stack 经过排查,原来是程序代码一次性从数据库加载了全部的数据,没有分页导致的,修改完代码后一切正常了~~

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!