内存泄露检测工具介绍——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, 并以通知的形式展示出来。
原文地址: 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, 并以通知的形式展示出来。
相关文章推荐
- Android应用自动更新功能的代码实现
- wpf 父控件透明子控件不透明
- Codis集群部署测试
- hdu 4324 Triangle LOVE (targan判连通)
- 网络爬虫2--PHP/CURL库(client URL Request Library)
- Python——条件分支
- 性能测试之一----I/O读写速度(2)
- (译)Getting Started——1.3.3 Working with Foundation(使用Foundation框架)
- linux 添加、删除硬盘 mount/unmount
- 卸载oracle 11g数据库软件
- 从 IHTMLDocument2 获得/写入 HTML 文本 (IPersistStreamInit)
- Swift字典
- getDimension和getDimensionPixelSize的区别
- LintCode-最长公共子串
- HttpServletRequest类的getAttribute()方法与getParameter()方法的区别
- 好东西大家一起分享
- hdu 1269 迷宫城堡(tarjan判连通)
- python matplotlib 画心形线
- 简明 Python 编程规范
- Android WebView 获取网页的标题