内存泄露分析之MAT工具

MAT的全称是Eclipse Memory Analyzer,一款强大的内存泄漏分析工具,MAT不需要安装,下载后解压即可使用。

对于Eclipse来说,MAT也有插件版,但是不建议使用,因为独立版使用起来更加方便,即使不安装Eclipse也可以正常使用,当然前提是有内存分析后的hprof文件;

使用流程:

1.编译代码,安装apk;

2.打开DDMS界面,用鼠标选中要分析的进程,然后使用待分析应用的一些功能,这样做是为了将尽量多的内存泄露暴露出来;

3.单击Dump HPROF file这个按钮,等待一小段时间即可导出一个hprof后缀的文件;

4.导出hprof后并不能使用它来进行分析,因为它不能被MAT直接识别,需要通过hprof-conv命令进行转换。hprof-conv命令是android SDK提供的工具,位于Android SDK的platform-tools目录下:

如:hprof-conv com.ryg.xxx.hprof com.ryg.xxx-conv.hprof

当然如果使用的是Eclipse插件版的MAT,不需要进行格式转换,可以直接用MAT插件打开;

5.经历了上面的步骤,就下来就可以直接通过MAT来进行内存分析了。打开MAT,通过菜单打开刚才转换后的com.ryg.xxx-conv.hprof这个文件,这时就可以看到MAT的内存分析主界面;

6.MAT提供了很多功能,最常用的只有Histogram和Dominator Tree。

通过Histogram可以直观的看出内存中不同类型的buffer的数量和占用的内存大小;

Dominator Tree则把内存中的对象按照从大到小的顺序进行排列,并且可以分析对象之间的引用关系,内存分析就是通过Dominator Tree来完成的。

7.分析内存泄漏,需要分析Dominator Tree里面的内存信息,在Dominator Tree中的内存泄漏原因一般不会直接显示出来,这个时候就需要按照从大到小的顺序去排查。

如,Bitmap泄漏,一般来说Bitmap泄漏往往都是由于程序的某个地方发生了内存泄漏引起的,在Dominator Tree中选中它,点击鼠标右键->Path To GC Roots->exclude wake/soft references(这是排除弱引用和软引用,因为他们都有较大几率会被GC回收掉,他们并不能造成内存泄漏),这时就可以看到bitmap对象被谁引用而导致无法释放;

如果我们知道了内存泄漏所发生的类,还可以使用Dominator Tree中的搜素功能,比如我们的MainActivity对象无法被回收,我们尝试搜素MmainActivity,会发现有6个MainActivity对象,因为每次按back键退出再重新进入MainActivity都会重新创建一个新的MainActivity,而老的MainActivity无法被回收,所以就出现了多个MainActivity对象的情形。

转载于:https://my.oschina.net/u/3491256/blog/906362

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值