在实际开发中或多或少我们都会遇到java的内存问题,特别是开发android程序和大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现。JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储 (Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据。
通常内存泄露分析被认为是一件很有难度的工作,一般由团队中的资深人士进行。不过,今天我们要介绍的 MAT(Eclipse Memory Analyzer)被认为是一个“傻瓜式“的堆转储文件分析工具,你只需要轻轻点击一下鼠标就可以生成一个专业的分析报告。和其他内存泄露分析工具相比,MAT 的使用非常容易,基本可以实现一键到位,即使是新手也能够很快上手使用。
上一篇文件我们已经顺利在myeclipse上安装了mat插件并生成了.hprof文件。这里我们将主要看看这个分析报告怎么看,本人也是第一次使用,如果有什么不对的地方还请不吝指正
由于没有安装BIRT所以看不到图,BIRT很庞大,可以到这http://www.eclipse.org/downloads/download.php?file=/birt/downloads/drops/R-R1-4_2_2-201302161152/birt-report-framework-4_2_2.zip 下载。下载回来后解要到MyEclipse\MyEclipse 10\dropins目录下重启即可
重启后提示安装成功
再次双击打开.hprof文件可以看到
通过上面的概览,我们对内存占用情况有了一个总体的了解。先检查一下 MAT 生成的一系列文件。
接下来我们就可以来看看生成的报告都包括什么内容,能不能帮我们找到问题所在吧。您可以点击工具栏上的 Leak Suspects 菜单项来生成内存泄露分析报告,也可以直接点击饼图下方的 Reports->Leak Suspects 链接来生成报告。
下面开始分析报告,一般三个步骤:
1.查看整体的内存状况,先看Leak Suspects(可疑泄漏点图)
从图中可以看到有个占了52兆内存的对象,对象是一个map。为什么会一个map占据了系统52m的内存,谁阻止了垃圾回收机制对它的回收,接下来点击
在垃圾回收机制中有一组元素被称为根元素集合,它们是一组被虚拟机直接引用的对象,比如,正在运行的线程对象,系统调用栈里面的对象以及被 system class loader 所加载的那些对象。堆空间中的每个对象都是由一个根元素为起点被层层调用的。因此,一个对象还被某一个存活的根元素所引用,就会被认为是存活对象,不能被回收,进行内存释放。因此,我们可以通过分析一个对象到根元素的引用路径来分析为什么该对象不能被顺利回收。如果说一个对象已经不被任何程序逻辑所需要但是还存在被根元素引用的情况,我们可以说这里存在内存泄露。
现在,让我们开始真正的寻找内存泄露之旅,点击“Details ”链接,可以看到如下图图所示对可疑对象 1 的详细分析报告。