使用Eclipse Memory Analyzer进行堆转储文件分析 - 编程入门网
用Eclipse Memory Analyzer进行堆转储文件分析(6)
时间:2011-09-04 IBM 仇璐 杨晓峰
查看报告之二:分析问题的所在 首先我们简单回顾下 JAVA 的内存回收机制,内存空间中垃圾回收的工作由垃 圾回收器 (Garbage Collector,GC) 完成的,它的核心思想是:对虚拟机可用内 存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对 象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于 再分配。 在垃圾回收机制中有一组元素被称为根元素集合,它们是一组被虚拟机直接引 用的对象,比如,正在运行的线程对象,系统调用栈里面的对象以及被 system class loader 所加载的那些对象。堆空间中的每个对象都是由一个根元素为起点 被层层调用的。因此,一个对象还被某一个存活的根元素所引用,就会被认为是 存活对象,不能被回收,进行内存释放。因此,我们可以通过分析一个对象到根 元素的引用路径来分析为什么该对象不能被顺利回收。如果说一个对象已经不被 任何程序逻辑所需要但是还存在被根元素引用的情况,我们可以说这里存在内存 泄露。 现在,让我们开始真正的寻找内存泄露之旅,点击“Details ”链接,可以看 到如图 8 所示对可疑对象 1 的详细分析报告。 图 8. 可疑对象 1 的详细分析报告 我们查看下从 GC 根元素到内存消耗聚集点的最短路径: 图 9. 从根元素到内存消耗聚集点的最短路径 我们可以很清楚的看到整个引用链,内存聚集点是一个拥有大量对象的集合, 如果你对代码比较熟悉的话,相信这些信息应该能给你提供一些找到内存泄露的 思路了。 使用Eclipse Memory Analyzer进行堆转储文件分析(7)时间:2011-09-04 IBM 仇璐 杨晓峰接下来,我们再继续看看,这个对象集合里到底存放了什么,为什么会消耗掉 如此多的内存。 图 10. 内存消耗聚集对象信息 在这张图上,我们可以清楚的看到,这个对象集合中保存了大量 Person 对象 的引用,就是它导致的内存泄露。 至此,我们已经拥有了足够的信息去寻找泄露点,回到代码,我们发现,是下 面的代码导致了内存泄露 : 清单 1. 内存泄漏的代码段
总结 从上面的例子我们可以看到用 MAT 来进行堆转储文件分析,寻找内存泄露非 常简单,尤其是对于新手而言,这是一个很好的辅助分析工具。但是,MAT 绝对 不仅仅是一个“傻瓜式”内存分析工具,它还提供很多高级功能,比如 MAT 支持 用 OQL(Object Query Language)对 heap dump 中的对象进行查询,支持对线 程的分析等,有关这些功能的使用可以参考 MAT 的帮助文档。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |