Android内存分析工具MAT

今天给大家介绍一下如何对Android应用进行内存分析,和常用的内存分析工具,希望朋友们能给喜欢!

如果使用 DDMS 确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问 题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定会把人逼疯, 特别是在维护别人写的代码的时候。 这里介绍一个极好的内存分析工具-- Memory Analyzer Tool(MA T。)

MA T是一个 Eclipse 插件,同时也有单独的 RCP 客户端。官方下载地址、MA T介绍和 详细的使用教程请参见:www.eclipse.org/mat,在此不进行说明了。另外在 MAT安装后的 帮助文档里也有完备的使用教程。在此仅举例说明其使用方法。我自己使用的是 MA T的 eclipse 插件,使用插件要比 RCP 稍微方便一些。

使用 MAT进行内存分析需要几个步骤, 包括: 生.成hprof 文件、 打开MAT并导入.hprof 文件、使用 MAT的视图工具分析内存。以下详细介绍。

(一) 生成.hprof 文件

生成.hprof 文件的方法有很多,而且 Android 的不同版本中生成.hprof 的方式也稍有差 别,我使用的版本的是 2.1,各个版本中生成.prof 文件的方法请参考: http://android.git.kernel.org/?p=platform/dalvik.git;a=blob_plain;f=docs/heap- profiling.html;hb=HEAD。

1. 打开 eclipse 并切换到 DDMS 透视图, 同时确认Devices、Heap 和 logcat 视图已经打开了; 2. 将手机设备链接到电脑,并确保使用“USB 调试”模式链接,而不是“Mass Storage“模 式; 3. 链接成功后在Devices视图中就会看到设备的序列号,和设备中正在运行的部分进程; 4. 点击选中想要分析的应用的进程,在 Devices 视图上方的一行图标按钮中,同时选中 “Update Heap”和“Dump HPROF file”两个按钮;

5. 这是 DDMS 工具将会自动生成当前选中进程的 .hprof 文件,并将其进行转换后存放在 sdcard 当中, 如果你已经安装了MAT插件, 那么此时MAT将会自动被启用, 并开始对.hprof 文件进行分析;

注意: 第4 步和第 5 步能够正常使用前提是我们需要有sdcard, 并且当前进程有向sdcard 中写入的权限(WRITE_EXTERNAL_STORAGE),否则.hprof 文件不会被生成,在 logcat 中 会显示诸如

ERROR/dalvikvm(8574): hprof: can't open /sdcard/com.xxx.hprof-hptemp: Permission denied.

的信息。

7Android 内存泄漏调试

如果我们没有 sdcard, 或者当前进程没有向sdcard 写入的权限 (如system_process),那 我们可以这样做: 6. 在当前程序中,例如framework中某些代码中,可以使用android.os.Debug中的:

方法,手动的指定.hprof 文件的生成位置。例如:

上述代码意图是希望在 xxxButton 被点击的时候开始抓取内存使用信息, 并保存在我们 指定的位置:/data/temp/myapp.hprof,这样就没有权限的限制了,而且也无须用sdcard。但 要保证/data/temp 目录是存在的。这个路径可以自己定义,当然也可以写成sdcard 当中的某 个路径。

(二) 使用MAT导入.hprof文件

1. 如果是eclipse自动生成的.hprof文件, 可以使用MAT插件直接打开 (可能是比较新的ADT 才支持) ; 2. 如果 eclipse 自动生成的 .hprof 文件不能被 MA T 直接打开,或者是使用 android.os.Debug.dumpHprofData()方法手动生成的 .hprof 文件,则需要将 .hprof 文件进行转 换,转换的方法:

例如我将.hprof 文件拷贝到 PC 上的/ANDROID_SDK/tools 目录下,并输入命令 hprof- conv xxx.hprof yyy.hprof,其中xxx.hprof 为原始文件,yyy.hprof为转换过后的文件。转换过 后的文件自动放在/ANDROID_SDK/tools 目录下。OK, 到此为止,.hprof 文件处理完毕,可 以用来分析内存泄露情况了。 3. 在Eclipse中点击Windows->OpenPerspective->Other->MemoryAnalyzer,或者打Memory AnalyzerTool的 RCP。在MAT中点击 File->OpenFile,浏览并导入刚刚转换而得到的.hprof 文件。

(三) 使用MAT的视图工具分析内存

导入.hprof 文件以后,MA T会自动解析并生成报告, 点击Dominator Tree, 并按Package 分组,选择自己所定义的 Package 类点右键,在弹出菜单中选择 List objects->With incoming references。这时会列出所有可疑类,右键点击某一项,并选择 Path to GC Roots -> exclude weak/soft references,会进一步筛选出跟程序相关的所有有内存泄露的类。据此,可以追踪 到代码中的某一个产生泄露的类。

MA T的界面如下图所示。

具体的分析方法在此不做说明了,因为在MAT的官方网站和客户端的帮助文档中有十 分详尽的介绍。

了解 MAT中各个视图的作用很重要,例如www.eclipse.org/mat/about/screenshots.php中 介绍的。

总之使用 MAT分析内存查找内存泄漏的根本思路,就是找到哪个类的对象的引用没有 被释放,找到没有被释放的原因,也就可以很容易定位代码中的哪些片段的逻辑有问题了。

至此请各位自己动手,丰衣足食吧!


引至:  http://www.gn00.com


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值