您的位置:首页 > 其它

一种新的MAT使用方法分析内存溢出问题

2012-02-14 08:55 369 查看
相信很多人都用过MAT来分析内存溢出,而且网上有很多的使用方法,不过很多都是大同小异,而我今天介绍一种新的使用MAT的方法来快速定位问题原因,希望对大家有所帮助。
本人最近一段时间都在忙android camera方面的项目,开发过程中遇到了一个很棘手的问题,就是不停的快速进相机和退出相机,这样重复大概十多次后程序就会崩溃,看log显示是out of memory,很明显是由于内存溢出导致的程序挂了,通过在网上搜集相关资料发现可以使用MAT工具来分析内存泄露问题,下面几个网站是我找到的关于内存溢出的文章,大家可以先借鉴下,在这也很感谢他们的分享:

android 内存溢出问题分析

/article/7964416.html

避免Android内存泄露

/article/1379148.html

android中context及全局变量小析
http://blog.csdn.net/aomandeshangxiao/article/details/7008636
Android内存分析工具

/article/1358295.html

Android 官方博客 - Android应用程序的内存分析(翻译)
http://dev.10086.cn/blog/?uid-13136-action-viewspace-itemid-9580
在我参与的camera项目中,看log表面上是显示由于内存不足导致图片导入不进去,可是我对于程序中的bitmap都进行过释放,感觉这个不是根本原因,而且试过将代码中的context换成Application context,可还是于事无补,最后通过MAT工具发现是由于代码中通过handler发送的大量消息在程序结束时没有清除掉,导致一系列引用不能被释放。所以在这里也补充一点,handler发送消息没有回收也可能会导致内存溢出。下面就让我介绍下如何使用MAT来分析问题吧(由于机密问题,所以没有把自己代码的截图呈上,请见谅)

1.用MAT打开转换好的prohf文件,如下图1所示



图1

2.选择工具栏中的“Open Dominator Tree for entire heap”,如下图2所示



图2

3.此时你会看到图中列出了一堆条目,而且很多都是你没见过或者不熟悉的,没关系,一般内存溢出都是由于我们自己写的代码导致的,所以先去找跟你包相关的条目,在这也说明下,往往这种操作很多次后才出现内存溢出的问题时,你会发现在图2中有很多相同的条目出现在一起,很可能问题就出在这里,所以先从这里下手,按照图2中的操作选择“exclude weak/soft references”,选择之后如下图3所示:



图3

4.同样在图3中,首先找跟你程序相关的条目然后一级一级的进入最终的跟路径,我们就能找到根本原因,是什么引用导致其他的一系列的资源不能被回收。在我的相机程序里最终发现是由于自己写的handler发送的消息在程序结束时一直没有清除,所以当我在程序中添加了mMainHandler.removeCallbacksAndMessages(null);问题就解决啦。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: