LeakCanary

简介

LeakCanary是Square公司最近公布的开源项目,旨在消除Android中的内存泄露(Memory Leak),项目地址猛戳这里。

使用

LeakCanary的使用也非常之简单,仅需要在Application中添加一行代码

public class ExampleApplication extends Application {  @Override public void onCreate() {    super.onCreate();    LeakCanary.install(this);  }}

当然依赖也是必须的

dependencies {   debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'   releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3' }

在这里分别使用了debugCompilereleaseComile是为了在开发测试和发布时,发现内存泄露执行不同Action。

当使用debug编译时,如果Activity发生了内存泄露,LeanCanary会自动发送Notification提醒你,点击之后会展现内存泄露的详细信息,列出相关的对象引用。

并且还会在logcat中打印相关的信息:

In com.example.leakcanary:1.0:1 com.example.leakcanary.MainActivity has leaked:

  • GC ROOT thread java.lang.Thread. (named 'AsyncTask #1')
  • references com.example.leakcanary.MainActivity\$3.this\$0 (anonymous class extends android.os.AsyncTask)
  • leaks com.example.leakcanary.MainActivity instance
  • Reference Key: e71f3bf5-d786-4145-8539-584afaecad1d
  • Device: Genymotion generic Google Nexus 6 - 5.1.0 - API 22 - 1440x2560 vbox86p
  • Android Version: 5.1 API: 22
  • Durations: watch=5086ms, gc=110ms, heap dump=435ms, analysis=2086ms

如果你认为LeakCanary能做的只有这样,那你就大错特错了。只要你想,它还可以监视任何对象。

RefWatcher refWatcher = LeakCanary.install(this);

然后在你觉得对象要被虚拟机回收的时机让RefWatcher观察这个对象:

refWatcher.watch(obj)

结果

在使用LeakCanary之后,Square声称减少了94%OOM产生的crash,甚至还发现了Android SDK中的内存泄露。

原理

其实LeakCanary的原理也很简单,简单来说就是创建了一个WeakReference对象,如果触发了GC之后这个对象存在,则说明发生了内存泄露。接着dump内存,分析引用,发送通知。

  1. RefWatcher.watch()在观察对象中添加一个KeyedWeakReference。
  2. 接着过一段时间,后台线程会检查观察对象是否还存活着,如果是,则触发GC。
  3. 如果观察对象仍然存在,则表示发生了内存泄露。LeakCanary会dump内存生成.hprof文件在应用文件目录下。
  4. 在另一个进程中启动HeapAnalyzerServiceHeapAnalyzer借助HAHA来分析内存。
  5. HeapAnalyzer在dump文件中找到KeyedWeakReference,并且找到泄露的引用。
  6. HeapAnalyzer计算到GG Root的最短路径,并判断是否是一个的内存泄露。如果是,生成引用的路径链。
  7. 最终接口会发送到app进程中的DisplayLeakService,执行接下来的操作,debug环境默认是发送一个Notification。
参考地址
  • https://github.com/square/leakcanary
  • https://corner.squareup.com/2015/05/leak-canary.html

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android(安卓)- SharedPreferences 数据存储
  6. Android(安卓)Studio 设置内存大小及原理
  7. Ubuntu编译Android(安卓)KitKat 4.4出现Chromium gyp HashSet_jn
  8. Android(安卓)Gradle 插件(二)
  9. React Native Android(安卓)开发巨坑

随机推荐

  1. android 空调遥控器——红外设备(基础)
  2. android回调机制总结
  3. Android(安卓)控件自动“移入、暂停、移
  4. 介绍一个很全面源码关于android 账户管理
  5. android处理拍照旋转问题及带来的对内存
  6. Android实训案例(九)——答题系统的思绪,自
  7. Android如何正确的保存文件
  8. Android高效率编码-第三方SDK详解系列(三
  9. 在android中使用Get方式提交数据
  10. Android仿iOS实现三级联动选择器