快速业务通道

使用Eclipse Memory Analyzer进行堆转储文件分析 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
用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. 内存泄漏的代码段

while (1<2)   {   Person person = new Person("name","address",i);   v.add(person);   person = null;   }

总结

从上面的例子我们可以看到用 MAT 来进行堆转储文件分析,寻找内存泄露非 常简单,尤其是对于新手而言,这是一个很好的辅助分析工具。但是,MAT 绝对 不仅仅是一个“傻瓜式”内存分析工具,它还提供很多高级功能,比如 MAT 支持 用 OQL(Object Query Language)对 heap dump 中的对象进行查询,支持对线 程的分析等,有关这些功能的使用可以参考 MAT 的帮助文档。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号