您的位置:首页 > 其它

内存泄露检测工具介绍——leakcanary

2015-06-25 18:54 375 查看
在android开发过程中经常碰到OOM的情况,下面介绍一个检查OOM非常实用的工具——leakcanary

原文地址: https://corner.squareup.com/2015/05/leak-canary.html

中文翻译: http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/

具体关于leakcanary的介绍可以参考上面两篇文章,下面主要说下怎么使用。

参考文章: https://github.com/square/leakcanary

首先搞定库文件:

下载好5个包:

 haha-1.3.jar

leakcanary-analyzer-1.3.1.jar

leakcanary-android-1.3.1.aar

leakcanary-android-no-op-1.3.1.aar

leakcanary-watcher-1.3.1.jar

下载地址:http://search.maven.org/

将五个库文件放到项目的libs目录下面,然后修改build.gradle文件,将新增的几个库文件加入到项目编译中。

修改build.gradle文件:

jar文件直接加入到compile文件中,对于aar文件则需要再加上后半段repositories进行编译,另外注意这两个文件:leakcanary-android-1.3.1 和  leakcanary-android-no-op-1.3.1 不能同时加入编译。

dependencies {
/*add more ...*/
chnCompile files('libs/leakcanary-analyzer-1.3.1.jar')
chnCompile files('libs/leakcanary-watcher-1.3.1.jar')
chnCompile files('libs/haha-1.3.jar')

compile(name:'leakcanary-android-1.3.1',ext:'aar')
//compile(name:'leakcanary-android-no-op-1.3.1',ext:'aar')
}

repositories {
flatDir{
dirs 'libs'
}
}

接下来就是在需要进行内存泄露的代码中加入OOM检测机制:
参照这个吧: https://github.com/square/leakcanary  讲的很详细了。

检测内存泄露的原理:

RefWatcher.watch() 创建一个 KeyedWeakReference 到要被监控的对象。

在当前的activity或者fragment进入onDestory()销毁对象时,如果引用还是未被清除,把 heap 内存 dump 到 APP 对应的文件系统中的一个 .hprof 文件中。

在另外一个进程中的 HeapAnalyzerService 有一个 HeapAnalyzer 使用HAHA 解析这个文件。

得益于唯一的 reference key, HeapAnalyzer 找到 KeyedWeakReference,定位内存泄露。

HeapAnalyzer 计算 到 GC roots 的最短强引用路径,并确定是否是泄露。如果是的话,建立导致泄露的引用链。

引用链传递到 APP 进程中的 DisplayLeakService, 并以通知的形式展示出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: