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

在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, 并以通知的形式展示出来。


posted on 2015-06-25 18:55  kma  阅读(100)  评论(0编辑  收藏  举报

导航