使用Memory-Analyzer分析内存泄漏

Posted 倔强的冬瓜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Memory-Analyzer分析内存泄漏相关的知识,希望对你有一定的参考价值。

其实Java下的内存泄漏的概念和C中的不一样。Java中的内存泄漏实际上是指Java程序一直持有某个对象的引用,但是从程序逻辑上看,这个对象再也不会被用到了,我们就认为这个对象的空间被泄露了。如果这种情况持续增加,最终会导致OutOfMemory异常。

    如果发现Java应用程序占用的内存出现了泄露的迹象,那么我们一般采用下面的步骤分析

   1. 把JVM中的堆复制下来
   2. 使用Java 堆分析工具,找出可疑的对象(嫌犯)
   3. 必要时,需要分析嫌犯和其他对象的引用关系
   4. 查看程序的源代码,找出嫌疑对象数量过多的原因及没有及时释放的原因。

复制堆
    如果Java应用程序出现了内存泄露的迹象,千万别着急着把应用杀掉,而是要保护现场。保存现场的目的就是为了把运行中JVM的堆复制下来,供进一步分析使用。JDK有自带的jmap工具,因此我们可以直接使用。使用该工具的方法是直接在命令行中输入:
jmap -dump:format=b,file=heap.bin pid
其中format参数是指导出的格式,b表明以二进制形式导出。
File指定了导出文件的路径。注意format和file参数之间是使用逗号分隔的。
最后的pid是JVM进程的进程号(如果不知道怎么得到进程号,请向百度求助)

分析堆
堆已经导出了,但是要怎样分析呢?我们不可能直接去读二进制的文件(当然,就算是文本格式的文件,直接读也是不可能的)。要想将导出的文件变成人类能够直接阅读和理解的信息,就要借助工具了。 
Eclipse提供了一个开源项目Memory Analyzer,简称为MAT。它可以分析包含数亿个对象的堆,计算每个对象占用的内存的大小以及对象之间的引用关系,还可以自动检测内存泄漏的嫌疑对象。
在功能强大之余,界面还很友好易用。该工具提供两个形式的版本,一种是Eclipse插件,另外一种是Eclipse RCP。下面就是Eclipse RCP版本的主界面:


 

选择File-->OpenHeap Dump...打开刚才创建的文件,就可以进行相应的分析了。下面是一个简单的截图:


 

MAT工具的具体使用,请参看相应的帮助文档。下面只是简单的介绍一个我经常使用的功能。在上面的饼状图上点击鼠标左键,选择LeakIdentification菜单,进行内存泄漏的检测: 


以上是关于使用Memory-Analyzer分析内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

IOS性能调优系列:使用Instruments动态分析内存泄漏

IOS性能调优系列:使用Instruments动态分析内存泄漏

使用 Eclipse 内存分析器查找内存泄漏

内存泄漏的场景分析和避免方法总结,C语言内存泄漏详解!

分析仪结果与仪器泄漏:iPhone 内存泄漏

iOS - XCode 4.4 - 使用分析的潜在内存泄漏