一次OOM的排查过程
2016-07-12 10:29
211 查看
最近测试环境的Java应用经常挂掉,用jconsole查看堆内存使用情况,如下图:
在达到高峰的时候tomcat服务挂了,看图可以知道使用内存过大,于是开始追踪元凶。
加入启动参数
在catalina.sh加入-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/web/tomcat7/temp/oom.hprof
第一个参数是当发生OOM是生成heap dump文件,第二个参数是指定文件路径
MAT工具分析
将生成的oom.hprof载入MAT进行分析(MAT工具下载地址:迅雷下载链接),如下图:
工具怎么使用在此不讲了,参考官网wiki介绍。
点击图中Reports 下的 Leak Suspects,这里会列出了工具怀疑的内存泄露点,不过工具怀疑的也未必真的是存在的,但提供了一种参考。如下图:
图中怀疑内存泄漏点有四处,点击图中第一处的details查看详细情况,如下图:
从图中可以看到一个ArrayList有240097个对象引用没有释放掉,这才是导致OOM的原因,再查看报告中的Thread Stack,找到具体代码所在处,如下图:
经过排查,原来是程序代码一次性从数据库加载了全部的数据,没有分页导致的,修改完代码后一切正常了~~
在达到高峰的时候tomcat服务挂了,看图可以知道使用内存过大,于是开始追踪元凶。
加入启动参数
在catalina.sh加入-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/web/tomcat7/temp/oom.hprof
第一个参数是当发生OOM是生成heap dump文件,第二个参数是指定文件路径
MAT工具分析
将生成的oom.hprof载入MAT进行分析(MAT工具下载地址:迅雷下载链接),如下图:
工具怎么使用在此不讲了,参考官网wiki介绍。
点击图中Reports 下的 Leak Suspects,这里会列出了工具怀疑的内存泄露点,不过工具怀疑的也未必真的是存在的,但提供了一种参考。如下图:
图中怀疑内存泄漏点有四处,点击图中第一处的details查看详细情况,如下图:
从图中可以看到一个ArrayList有240097个对象引用没有释放掉,这才是导致OOM的原因,再查看报告中的Thread Stack,找到具体代码所在处,如下图:
经过排查,原来是程序代码一次性从数据库加载了全部的数据,没有分页导致的,修改完代码后一切正常了~~
相关文章推荐
- Java 6 JVM参数选项大全(中文版)
- 深入解析JVM对dll文件和对类的装载过程
- JVM Tomcat性能实战(推荐)
- Java虚拟机JVM性能优化(二):编译器
- Java程序员必须知道的5个JVM命令行标志
- Java虚拟机JVM性能优化(三):垃圾收集详解
- 简单谈谈JVM、JRE和JDK的区别与联系
- 解析Java虚拟机中类的初始化及加载器的父委托机制
- JAVA中JVM的重排序详细介绍
- 浅谈Java的虚拟机结构以及虚拟机内存的优化
- JVM角度调试优化MyEclipse
- Java虚拟机JVM性能优化(一):JVM知识总结
- Android Studio 报错failed to create jvm error code -4的解决方法
- 解析Linux系统中JVM内存2GB上限的详解
- 了解Java虚拟机JVM的基本结构及JVM的内存溢出方式
- Java堆空间占满的gc日志实例
- JVM调优之Tomcat启动参数配置及详解(一)
- java动态代理模式
- 一次FULL GC问题的排查
- Groovy Meta Object Protocol