一种新的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

       androidcontext及全局变量小析

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


                                                                                                                                                                      图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);问题就解决啦。。。

你可能感兴趣的:(android)