内存泄漏简析

#1、内存泄漏原因
常见的内存泄漏原因是由于 引用导致,即对象引用时导致对象不可以释放的根本原因,对象不能释放,所以导致内存泄漏。
#2、内存泄漏分析工具
分析工具采用android device monitor 、MAT、GIMP工具来分析内存
MAT地址
http://eclipse.org/mat/downloads.php
GIMP下载地址
https://www.gimp.org/
首先要导出hprof文件,并利用命令行进行hprof-conv转换,具体操作,百度搜索,注意一点,在进行点击app页面通过android device monitor来进行获取hprof文件的时候,需要退出所监听内存的页面,并点击一下GC,再进行dump hprof文件。
#3、具体内存泄漏分析方法
查找内存泄漏对象的方法

参考 https://blog.csdn.net/yincheng886337/article/details/50524890
1、通过日志OOM现象,切换到同一个页面,不断进行重复切换过程中,发现切换到同一个页面,内存有增加现象,
说明其他页面可能有内存泄漏现象
2、通过MAT查看 系统报出的疑似泄漏对象,通过incoming reference 查看引用链条
3、确定泄漏原因

1、Histogram具体对象泄漏
1.1、按照包来找到最大的内存对象
这里写图片描述
并通过size来筛选其中大于1000在Retained Heap中输入,或者通过你所知道的可能占用内存的通用父类进行筛选在Package/Class中输入fragment
这里写图片描述

2、Dominator Tree分析具体图片对象泄漏
通过Dominator Tree来找到当前最占用内存的对象,从大到小进行排列
其中Shallow Heap 自身占用内存 和 Retained Heap引用对象内存,不成比例的,如红色标注的第一种情况,是很有可能是内存泄漏的重点
对于Shallow Heap 和 Retained Heap大小相等的这种对象,一般不是内存泄漏,但对象这么大本身也可能存在问题,可以查看具体对象是什么,再做优化
这里写图片描述
3、通过引用链具体分析内存引用点,查看drawable外部引用
这里写图片描述
并找到buffer,通过GIMP工具讲save的图片打开,注意宽高对应,save的格式为 xxx.data
这里写图片描述
之后通过GIMP工具查看到图片和本地app中图片对应,找到具体的图片泄漏代码,去除图片的引用,达到释放图片所占用内存的目的
4、通过GC找到对象泄漏点(注意去除虚引用,弱引用和软引用,具体app不便透露请见谅),来进行对象释放
这里写图片描述
注意红线方向从上到下是一条导致底部对象无法释放的引用链,其中任何一环的对象释放,都可以此环对象下的所有对象释放,那么我们可以看到,如果释放了mLocationListeners,那么底部的this对象便会释放,所以可以回到我们的代码进行将mLocationListeners引用释放
这里写图片描述
#4、总结内存泄漏的解决办法
handler
引用换为弱引用
webview独立进程等
图片释放
具体网络搜索暂不详述。

以上为简略分析内存泄漏的方式和方法,仅作抛砖引玉,谢谢阅读!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值