LeakCanary是Android查找内存泄漏的主要工具,由Square公司开发,可以直接在手机端查看内存泄露的工具。其使用方法如下:
第一步:

    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.6.1'releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1'testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1'

第二步:

public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();instance = this;if (LeakCanary.isInAnalyzerProcess(this)) {//1// This process is dedicated to LeakCanary for heap analysis.// You should not init your app in this process.//            如果当前的进程是用来给LeakCanary 进行堆分析的则return,否则会执行LeakCanary的install方法。
//            这样我们就可以使用LeakCanary了,如果检测到某个Activity 有内存泄露,LeakCanary 就会给出提示。return;}LeakCanary.install(this);}
}

通过这两个步骤的,就可以使用Leakcanary来监控Activity的内存泄漏情况了,如果还想要监控Fragment的内存泄漏情况,则需要修改Application,修改后的代码如下所示:

public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();instance = this;refWatcher= setupLeakCanary();}private RefWatcher setupLeakCanary() {if (LeakCanary.isInAnalyzerProcess(this)) {// This process is dedicated to LeakCanary for heap analysis.// You should not init your app in this process.//            如果当前的进程是用来给LeakCanary 进行堆分析的则return,否则会执行LeakCanary的install方法。
//            这样我们就可以使用LeakCanary了,如果检测到某个Activity 有内存泄露,LeakCanary 就会给出提示。return RefWatcher.DISABLED;}return LeakCanary.install(this);}public static RefWatcher getRefWatcher(Context context) {MyApplication leakApplication = (MyApplication) context.getApplicationContext();return leakApplication.refWatcher;}}

install方法会返回RefWatcher用来监控对象,LeakApplication中还要提供getRefWatcher静态方法来返回全局RefWatcher。最后为了举例,我们在一段存在内存泄漏的代码中引入LeakCanary监控,如下所示:

public class InnerClassLeakActivity extends AppCompatActivity {private static Leak sLeak;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_leak_common);sLeak = new Leak();sLeak.test();}private class Leak {private void test(){LogUtil.i("test method execute");}}@Overrideprotected void onDestroy() {super.onDestroy();RefWatcher refWatcher = MyApplication.getRefWatcher(this);refWatcher.watch(this);}
}

InnerClassLeakActivity 存在内存泄漏,因为非静态内部类Leak的静态实例对象sLeak持有外部类InnerClassLeakActivity 的实例,导致即使InnerClassLeakActivity 销毁了,InnerClassLeakActivity 也不能被GC回收。
由于Leakcanary自动监控Activity执行onDestroy方法之后是否发生内存泄露,当前此例onDestroy加是多余的,
这里只是为了方便举例,如果想要监控Fragment,在Fragment中添加如上的onDestroy方法是有用的。

通过不断的打开InnerClassLeakActivity和关闭这个页面,会出现
提示内容为“Dwnping memory app will 企eeze.Brrrr. ”。稍等一会儿,内存泄漏的信息就会出现在Notification,如下图所示:

点击上图中红框的条目,就可以看到如下图所示的,关于内存泄漏的详细信息:

通过展示的泄漏的详情,可以看到确实是InnerClassLeakActivity发生了内存泄漏,泄漏的原因就是
InnerClassLeakActivity.sLeak这个静态变量持有了InnerClassLeakActivity的实例导致,InnerClassLeakActivity 即使被销毁,也无法被GC回收,造成内存泄漏。解决这个内存泄漏的方法是,将sLeak这个静态变量改成非静态的即可。或者将非静态内部类Leak改成静态内部类。

使用时需要注意的点:
a.因为LeakCanary需要生成hprof文件,保存在SD卡里面,因此你的应用要先申请权限添加读写外部存储的权限,在安装应用后手动打开权限。

<!– 向SDCard写入数据权限 –>
<uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>

b.将新添加leakcanary的activity和service属性android:enabled修改为true

c.有时候一直无法生成报告,输出如下log

LeakCanary: Could not dump heap, previous analysis still is in progress.

删除/sdcard/Download/leakcanary-包名/目录下的文件,再重新抓取一次。

d.如果报了如下异常:

java.lang.NullPointerException: Attempt to invoke virtual method’boolean java.lang.String.equals(java.lang.Object)’ on a null object reference
atcom.squareup.leakcanary.HeapAnalyzer.findLeakingReference(HeapAnalyzer.java:160)

是LeakCanary的版本过低了,不适合Android6.0及以上的机型,升级到1.5及以上版本的就没问题了。

参考:
android – LeakCanary报告在InputMethodManager中泄漏
http://www.voidcn.com/article/p-agkoubcz-bur.html

性能优化工具(九)-LeakCanary
https://www.jianshu.com/p/70b8c87ea877

LeakCanary使用经验小结
https://blog.csdn.net/zuo_er_lyf/article/details/79162017

Android系统App中使用Leakcanary
https://blog.csdn.net/abc_1234d/article/details/72478385

Leakcanary的使用相关推荐

  1. android 监测内存泄漏工具,LeakCanary:Android内存泄漏检测工具

    LeakCanary A memory leak detection library for Android and Java. "A small leak will sink a grea ...

  2. LeakCanary 源码解析

    LeakCanary 是什么? LeakCanary是Square公司基于MAT开源的一个工具,用来检测Android App中的内存泄露问题.官方地址:https://github.com/squa ...

  3. LeakCanary(一)使用篇

    图中的demo用于制造内存泄漏的情况,除非Docker类的classLoader被回收,不然static Box container对应的内存不会被回收. 相关链接:(前一篇是官方的中文使用文档,后一 ...

  4. 安卓 内存泄漏检测工具 LeakCanary 使用

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 配置  build.gradle dependencies {debugCompile 'com ...

  5. 使用LeakCanary遇到的问题 就是不弹出来

    今天楼主遇到引用LeakCanary时代码跟官网一样但是就不弹出来.楼主新建项目就可以正常使用.楼主郁闷半天,现在终于整出来了. 楼主主工程app引用module为thirdParty,本想为了整洁三 ...

  6. android内存泄漏原因分析,Android Studio3.6的内存泄漏检测功能 VS LeakCanary

    2020年2月,谷歌发布了Android Studio 3.6版.它包括一个新的"内存泄漏检测"功能.这是否意味着我们不再需要流行的内存泄漏检测库"Leak Canary ...

  7. Android开源框架——内存泄漏检测工具 LeakCanary

    开源地址:https://github.com/square/leakcanary FAQ : https://github.com/square/leakcanary/wiki/FAQ 配置 bui ...

  8. LeakCanary——消除Android中的内存泄露

    2019独角兽企业重金招聘Python工程师标准>>> ##LeakCanary ####简介 LeakCanary是Square公司最近公布的开源项目,旨在消除Android中的内 ...

  9. LeakCanary: 让内存泄露无所遁形

    LeakCanary: 让内存泄露无所遁形 09 May 2015 本文为LeakCanary: Detect all memory leaks!的翻译.原文在: https://corner.squ ...

  10. LeakCanary 源码分析

    1. 前言 LeakCanary 是由 Square 开发的一款内存泄露检测工具.相比与用 IDE dump memory 的繁琐,它以轻便的日志被广大开发者所喜爱.让我们看看它是如何实现的吧. ps ...

最新文章

  1. 常微分方程数值求解【python】
  2. CUDA程序优化技巧
  3. 利用Sqoop将MySQL海量测试数据导入HDFS和HBase
  4. 使用pssh进行并行批量操作
  5. 《看聊天记录都学不会Python到游戏实战?太菜了吧》(10)无底洞的循环
  6. 发票管理软件_财务人员都在用的这款发票管理软件,真的值得购买么?
  7. labuladong 的算法小抄_来自GitHub 68.8k star的硬核算法教程
  8. 简述计算机j选件,计算机组成原理06new.ppt
  9. 彻底理解js是单线程
  10. 重载运算符operator
  11. 打分现场流程策划及排练大致流程-仅参考
  12. 中国移动手机支付开放平台网站服务协议
  13. SVG-edit 是一个快速的、基于 Web 的、由 JavaScript 驱动的 SVG 绘图编辑器
  14. 智能语言处理之依存树计算句子结构相似度计算
  15. Flask接口服务处理全局异常
  16. 发表Nature等杂志四十多篇论文老师带您学单细胞测序数据挖掘和课题设计 2020年1月11-12日 上海...
  17. 自动化构建工具Grunt、Gulp
  18. ESP32 下载与烧录最新固件
  19. 如何解决Oracle11g使用dmp命令无法导出空表问题
  20. 如何在 iOS、MacOS 上使用 ChatGPT 和适用于 iPhone 的最佳 ChatGPT 应用程序

热门文章

  1. 打印机彩色打印设置(将彩色打印为黑色)
  2. 程序员求职攻略(《程序员面试笔试宝典》)之面试笔试技巧?
  3. ChatGPT:新晋CV工程师
  4. 交换机和服务器维护,网络交换机系统升级与维护之个人见解
  5. 新的计划——XX监测与预警平台
  6. K8S数据采集组件metrics-server安装
  7. 为Linux部署红旗紫光输入法
  8. MAT outgoing references / incoming references
  9. 长乐外海风电场创新应用,推动全球智慧海上风电发展
  10. 什么是SATA接口硬盘?无法正常使用时如何恢复数据