博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android内存泄漏的检测和排除
阅读量:6957 次
发布时间:2019-06-27

本文共 1440 字,大约阅读时间需要 4 分钟。

hot3.png

1、需要提前准备的两个工具,并完成配置


  1. eclipse的MAT内存分析工具,它的独立安装版本下载地址如下:

  1. square的leakcanary库 ,并参考readme配置。

2、如何知道是否发生内存泄漏


leakcanary库发布之前

为了评估应用是否发生内存泄漏,需要打开android studio的mermory monitor工具,一直玩耍需要测试的应用和手动触发gc,同时观察实时图例中的内存消耗情况。如果发现应用的内存一直处于增长状态,那么该应用有可能产生了内存泄漏。

dump文件格式转换

hprof-conv dump.hprof converted-dump.hprof

leakcanary库发布之后

leakcanary库可以自动检测当前fragment或者activity有没发生泄漏,如果发生了内存泄漏,手机的通知栏会对用户进行通知,并提示简易的泄漏堆栈信息,同时,leak库还会在手机的download文件夹中生成dump文件,该文件记录了当前时刻应用详细的消耗的内存信息,包括存在的类对象,类对象数量等。该dump文件借助MAT内存分析工具即可分析造成内存泄漏的代码段。

下面举一个真实项目的例子。下图是在调试分享库时获取到的内存泄漏信息。 image

从leakcanary的通知中可以得知,我们的SinaAssistActivity类发生了泄漏。我们从打开MAT工具,并用该工具打开dump文件。切换到OQL窗口,输入的查询命令可以获得所有在内存中的Activities。

select * from instanceof android.app.Activity

image

点击一个SinaAssistActivity对象,右键选中Path to GC roots。

image

从上图可知,com.github.thinwonton.share.core.ui.SinaAssistActivity 被三个类持有,分别是KeyedWeakReference、SinaShareHandler和PhoneWindow$DecorView。其中,KeyedWeakReference是leakcanary库的,PhoneWindow$DecorView是安卓系统的窗口类,这两个类不需要理睬。真正造成内存泄漏的原因是,SinaShareHandler中的mWeiboShareAPI属性一直持有SinaAssistActivity对象,即时在SinaAssistActivity#onDestroy后还不释放。此时,我们回到SinaShareHandler类中需找原因,分析如下:

SinaShareHandler中的mWeiboShareAPI属性是静态static的,我们在SinaShareHandler类的init初始化方法中给mWeiboShareAPI赋值,并令mWeiboShareAPI持有了SinaAssistActivity对象。但是,并没有在其它代码段中释放mWeiboShareAPI,由于static关键词使mWeiboShareAPI对象的生命周期持续到app结束,因此,SinaAssistActivity对象也没有得到及时释放。为了修复该bug,我们把SinaShareHandler类中mWeiboShareAPI对象声明为非static对象。

转载于:https://my.oschina.net/thinwonton/blog/1098900

你可能感兴趣的文章
bootstrap 2.3版与3.0版的使用区别
查看>>
高并发之 - 全局有序唯一id Snowflake 应用实战
查看>>
菜鸟学习笔记1
查看>>
office2003 安装步骤及注意事项
查看>>
手机抓包图文教程 【转载】
查看>>
fprintf、fflush(stdout)、printf、sprintf与fprintf 的用法区分
查看>>
EPANET头文件解读系列3——TOOLKIT.H
查看>>
深入单例模式(理解理解)
查看>>
凸问题、分类器
查看>>
51nod 1574 排列转换
查看>>
sql server高性能写入
查看>>
DropDownList绑定数据表实现两级联动示例
查看>>
学习笔记之Tips for Macbook
查看>>
LeetCode 49. Group Anagrams
查看>>
快速用梯度下降法实现一个Logistic Regression 分类器
查看>>
JavaScript实现本地图片上传前进行裁剪预览
查看>>
缺8数
查看>>
python3 内置方法 字符串转换为字典
查看>>
低端手机刷机--[2.3 固件ROM] GT-i5508、5500刷安卓2.3.7 包含(教程 刷机包 等)
查看>>
细说JS中的原型与原型链
查看>>