首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

(转)一种新的MAT使用方法分析内存溢出有关问题

2012-06-28 
(转)一种新的MAT使用方法分析内存溢出问题相信很多人都用过MAT来分析内存溢出,而且网上有很多的使用方法,

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

相信很多人都用过MAT来分析内存溢出,而且网上有很多的使用方法,不过很多都是大同小异,而我今天介绍一种新的使用MAT的方法来快速定位问题原因,希望对大家有所帮助。

??????? 本人最近一段时间都在忙android?camera方面的项目,开发过程中遇到了一个很棘手的问题,就是不停的快速进相机和退出相机,这样重复大概十多次后程序就会崩溃,看log显示是out?of?memory,很明显是由于内存溢出导致的程序挂了,通过在网上搜集相关资料发现可以使用MAT工具来分析内存泄露问题,下面几个网站是我找到的关于内存溢出的文章,大家可以先借鉴下,在这也很感谢他们的分享:

?????? android?内存溢出问题分析

?????? http://blog.csdn.net/com360/article/details/6682409

?????? 避免Android内存泄露

?????? http://blog.csdn.net/xyz_lmn/article/details/7108011

?????? android中context及全局变量小析

?????? http://blog.csdn.net/aomandeshangxiao/article/details/7008636

?????? Android内存分析工具

?????? http://blog.csdn.net/sunboy_2050/article/details/7031234

?????? 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所示

(转)一种新的MAT使用方法分析内存溢出有关问题

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图1

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

(转)一种新的MAT使用方法分析内存溢出有关问题

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图2

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

(转)一种新的MAT使用方法分析内存溢出有关问题

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?图3

??????? 4.同样在图3中,首先找跟你程序相关的条目然后一级一级的进入最终的跟路径,我们就能找到根本原因,是什么引用导致其他的一系列的资源不能被回收。在我的相机程序里最终发现是由于自己写的handler发送的消息在程序结束时一直没有清除,所以当我在程序中添加了mMainHandler.removeCallbacksAndMessages(null);问题就解决啦。。。

热点排行