android-【DDMS->heap->MAT】工具-内存分析工具

转自:http://blog.csdn.net/jingwen3699/article/details/7977275

http://blog.csdn.net/fulinwsuafcie/article/details/8363218


1. Windows->Preferences->Android->DDMS

check the 'Thread Updates Enabled'

check the 'Heap Updates Enabled'



2.在DDMS左边的面板选择需要查看的进程

然后在工具条上边点击 updates heap 按钮。这个时候切换到DDMS的VM Heap分页。

显示每次gc后heap内存的一些基本数据。(如果要看最新gc后的数据内容,点击Cause GC按钮)

我们可以看到现在的值(Allocated列)查看数据的内存值,反复操作模拟器的相关功能,再查看数据是否增大。



3. 

Heap视图界面会定时刷新,在对应用的不断的操作过程中就可以看到内存使用的变化。

怎样判断当前进程是否有内存泄漏呢?

这里需要注意一个值:VM Heap页面中部有一个data object选项,即数据对象,也就是我们的程序中大量存在的类类型的对象。

在data object一行中有一列是“Total Size”,其值就是当前进程中所有Java数据对象的内存总量,一般情况下,这个值的大小决定了是否会有内存泄漏。如上图中选中行所示。

可以据此判断内存有泄漏:
1) 不断的操作当前应用,或者重复某一动作,注意观察data object的Total Size值。

2) 正常情况下Total Size值都会稳定在一个有限的范围内,也就是说如果程序中的的代码逻辑良好,

没有创建的对象不被GC机制正常回收的情况,即便 我们不断的操作生成很多对象,而在虚拟机不断的进行垃圾回收的过程中,这些对象都被正常回收了,内存使用量会保持在一个比较稳定的水平。

3) 如果代码中存在对象引用没有释放的情况,则data object的Total Size值在每次GC后不会有明显的回落,随着操作次数的增多Total Size的值会越来越大。
正常情况下,一个虚拟机的进程的内存在64M, 如果内存泄漏会发现 Heap Size 在不断的逼近 64M, 一旦达到这个值时,就会出现退出应用等情况。


发生内存泄露,Total Size的值越来越大时,按下“Dump HPROF file”按钮,这个时候会提示设置hprof文件的保存路径。保存后,可以对比log来分析是哪些操作造成了内存泄漏。


4.点击 按钮,导出 hprof 文件,使用MAT 工具进行分析。具体分析步骤和过程详见下面链接

http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/index.html

打开 MAT 工具,File-->Open Heap Dump... 选择你刚刚保存的 hprof 文件打开

此时,会弹出一个错误,如下图所示:


提示:  Unknown HPROF Version (JAVA PROFILE 1.0.3) (java.io.IOException)

哦,不要以为是 MAT 工具版本不对,其实是 android 的 hprof 文件在这里需要进行转换一下格式才可以使用 MAT 打开,不知道 谷歌在这里

捣了什么鬼,难道是优化?

使用 android sdk 目录下的 tools 中一个工具进行转化一下

使用AndrodiSDK/tools/hprof-conv转化hprof文件, 

首先,要通过控制台进入到你的 android sdk tools 目录下

例如 hprof-conv input.hprof     out.hprof

再使用MAT工具打开转换后的 hprof 文件,就能看到完整的内存使用分析报告了。

如下所示是 MAT 分析内存使用的主界面:


点击上图中的 Reports -->Leak Suspects 则可以进一步看到更详细的内存泄漏疑点。


在其中怀疑的地方,点击 Details 就可以看到具体的内存使用情况了。

tip1:

有一种比较好的方法是,在内存泄漏开始时抓取一个 hprof 文件,在内存泄漏很厉害时,app 濒临崩溃时再抓取一个hprof 文件。

对比看这两个图,就很容易看出来上面的饼图中哪一块存在内存泄漏。

有的时候能直接看出来多了一块。那么我们就从那一块入手进行分析。比较快能得到结果。

tip2:

看 dominator_tree,可以从列表中 data_object 最多的几项数据入手分析,如下文件所示(136,80对应的两项)



我这边曾经就因为在 onStart 中添加了一个 PhoneStateListener 的监听,而在 onStop 中未设置为空,导致内存泄漏。

你可能感兴趣的:(android,内存泄漏,DDMS)