[Android内存分析] 使用MAT工具做内存泄露分析一

来源:互联网 发布:学编程用什么笔记本 编辑:程序博客网 时间:2024/06/07 03:20

今天向大家分享使用MAT工具做内存泄露分析的一些思路

通过MAT来分析一处潜在的内存泄露的问题,来帮助你使用MAT工具做内存泄露的分析

阅读前准备

内存分析是基于 [Android内存分析] 非UI线程使用View.post()方法一处潜在的内存泄漏 这里面的案例分析的,所以请先看完并理解此case。

看完这个case后,你可能有个疑惑,这些都是分析结果,那如何去验证它就有内存问题呢。
下面我们一起来通过mat工具来分析内存问题!
二个问题!

1、怎么去发现有内存泄露问题?

2、若发现有内存泄露问题,改如何去分析是哪里出问题了?如何解决?

1、通常有一个简单的办法,就是不断的操作你觉得可能导致内存泄露的操作,加重他的内存泄露大小,然后用DDMS提供的Update Heap查看操作前和操作后的内存有没有异常增加。
下面给出 [Android内存分析] 非UI线程使用View.post()方法一处潜在的内存泄漏 这个工程内存泄露的heap截图
操作前heap实例分析图:


操作后heap实例分析图:


通过比对,很明显发现,经过多次操作后,内存明显变大了很多。从这个得出结果,操作中导致了大量的内存泄露

2、现在我们知道这个工程是有内存问题的,那么我们来分析这第二个问题!
使用DDMS提供的Dump HPROF File获取.hprof文件,即当前应用程序的内存快照,并用eclipse提供的mat插件打开这个文件
打开之后,选择 "Histogram" 进入类列表直方图,这是显示所有类占用的内存情况,如下图:

从图中可以明显看到MainActivity占有的内存很大,约90MB。到这里你是不是觉得,哇!就是这出问题了!其实不是...这个是当前栈顶的MainActivity实例,可能是它有内存使用问题,但不能以此来断定它有内存泄露问题。
我们应该往下看,接下来有个醒目的实例MainActivity$1,它也占有了大量内存,这就不正常了,他是被finish的实例,内存还占用这么多,初步判断这地方出现内存泄露了。
下面我们看看MainActivity$1的被引用关系,如下图:




通过截图,可以找到其引用关系是 AsynckTask->ViewRootImpl的静态变量RunQueue->...->MainActivity$1
最终使MainActivity$1无法被GC回收,导致内存泄露。

到这里,你基本上已能清楚的看到,为什么会出现 [Android内存分析] 非UI线程使用View.post()方法一处潜在的内存泄漏 这个问题了。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 跑1000米要5分钟怎么办 孩子眼睛近视加散光怎么办 在部队混的差怎么办 2岁宝宝走路踮脚怎么办 宝宝走路膝盖弯曲不直怎么办 做了蛙跳大腿疼怎么办 跳完蛙跳腿疼怎么办 腿受凉了疼怎么办偏方 鸭子步蛙跳后腿疼怎么办 戴墨镜鼻子会红怎么办 校服黑色裙子染色了怎么办 新警培训时怀孕怎么办? 大学生欠了网贷怎么办? 车侧面底盘被刮怎么办 军人家属被打没人处理怎么办 孩子字写的难看怎么办 企业k宝锁死了怎么办 建行信用卡密码忘了怎么办 主卧对着卫生间怎么办 不会画农场的画怎么办 泰迪骨折了怎么办护理 狗狗的腿骨折了怎么办 狗狗摔了一下腿瘸了怎么办 狗狗前腿摔瘸了怎么办 狗摔跤腿瘸了怎么办 小狗的前腿弯了怎么办 两周的小狗缺钙怎么办 狗腿关节断了怎么办 五岁儿童抵抗力差怎么办 3岁儿童抵抗力差怎么办 四岁儿童抵抗力差怎么办 我孩子和我相冲怎么办 儿子不热母亲怎么办?单身呀? 大兔子吃小兔子怎么办 车窗贴膜里面有灰尘怎么办 陌陌小游戏不能玩游戏怎么办 电脑游戏里面的出现俄文怎么办 龙之谷手游转职业装备怎么办 如果函数值和类型不一致怎么办 qq提现不到账怎么办 提现的钱不到账怎么办