相信很多人都用过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所示
图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);问题就解决啦。。。
分享到:
相关推荐
NULL 博文链接:https://showlike.iteye.com/blog/1488720
内存溢出配置,内存溢出配置内存溢出配置内存溢出配置
JAVA内存溢出问题总结
程序运行要用到的内存大于虚拟机能提供的最大内存就发生内存溢出了, 内存溢出的问题要看业务和系统大小而定,对于某些系统可能内存溢出不常见,但某些系统还是很常见的解决的方法
Websphere Application Server WAS 内存溢出分析,帮助分析内存问题
JVisualVM简介与内存泄漏实战分析,如何分析内存溢出,定位内存溢出问题
解决内存溢出的问题,在使用myeclipse时候,经常遇到内存溢出的问题。
完美解决java读取excel内存溢出问题,希望可以帮到大家
处理bitmap内存溢出问题
从提升网络环境安全性的角度出发,提出了一种基于动态污点分析的Cisco IOS内存溢出攻击检测方法。首先,通过分析Cisco IOS的指令格式,根据指令的特点制定相应的污点传播规则,实现了对Cisco IOS的动态污点分析;...
内存溢出已经是软件开发历史上存在了近40年的“老大难”问题。在操作系统上运行各种软件时,软件所需申请的内存远远超出了物理内存所承受的大小,就叫内存溢出。 内存溢出产生原因多种多样,当内存严重不足时,内核...
在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。本文就介绍了Tomcat内存溢出的三种情况及解决办法分析
Java内存分析工具MAT(Memory Analyzer Tool) 可以解析内存的消耗,定位具体的类,定位问题
jprofiler的使用及联调内存溢出解决方案交流
软件开发 数据库 内存泄露 内存溢出
一次使用Eclipse Memory Analyzer分析Tomcat内存溢出.docx
内存溢出处理办法,生成内存溢出分析文件,可清楚因为什么原因导致内存溢出。
myeclipse内存溢出问题解决方案整理!介绍认识
我们上层应用平台是使用java开发的,但开放平台是使用c++开发,虽提供给我们对应的.h头文件,但在java中来解析这些数据就显然有些复杂,在实现、效率上都可能不太理想。 解决方案: 请C++同事帮忙写个dll程序,dll去...
kettle内存溢出(Java heap space)以及解决方法