Leakcanary的使用
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的使用相关推荐
- android 监测内存泄漏工具,LeakCanary:Android内存泄漏检测工具
LeakCanary A memory leak detection library for Android and Java. "A small leak will sink a grea ...
- LeakCanary 源码解析
LeakCanary 是什么? LeakCanary是Square公司基于MAT开源的一个工具,用来检测Android App中的内存泄露问题.官方地址:https://github.com/squa ...
- LeakCanary(一)使用篇
图中的demo用于制造内存泄漏的情况,除非Docker类的classLoader被回收,不然static Box container对应的内存不会被回收. 相关链接:(前一篇是官方的中文使用文档,后一 ...
- 安卓 内存泄漏检测工具 LeakCanary 使用
韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 配置 build.gradle dependencies {debugCompile 'com ...
- 使用LeakCanary遇到的问题 就是不弹出来
今天楼主遇到引用LeakCanary时代码跟官网一样但是就不弹出来.楼主新建项目就可以正常使用.楼主郁闷半天,现在终于整出来了. 楼主主工程app引用module为thirdParty,本想为了整洁三 ...
- android内存泄漏原因分析,Android Studio3.6的内存泄漏检测功能 VS LeakCanary
2020年2月,谷歌发布了Android Studio 3.6版.它包括一个新的"内存泄漏检测"功能.这是否意味着我们不再需要流行的内存泄漏检测库"Leak Canary ...
- Android开源框架——内存泄漏检测工具 LeakCanary
开源地址:https://github.com/square/leakcanary FAQ : https://github.com/square/leakcanary/wiki/FAQ 配置 bui ...
- LeakCanary——消除Android中的内存泄露
2019独角兽企业重金招聘Python工程师标准>>> ##LeakCanary ####简介 LeakCanary是Square公司最近公布的开源项目,旨在消除Android中的内 ...
- LeakCanary: 让内存泄露无所遁形
LeakCanary: 让内存泄露无所遁形 09 May 2015 本文为LeakCanary: Detect all memory leaks!的翻译.原文在: https://corner.squ ...
- LeakCanary 源码分析
1. 前言 LeakCanary 是由 Square 开发的一款内存泄露检测工具.相比与用 IDE dump memory 的繁琐,它以轻便的日志被广大开发者所喜爱.让我们看看它是如何实现的吧. ps ...
最新文章
- 常微分方程数值求解【python】
- CUDA程序优化技巧
- 利用Sqoop将MySQL海量测试数据导入HDFS和HBase
- 使用pssh进行并行批量操作
- 《看聊天记录都学不会Python到游戏实战?太菜了吧》(10)无底洞的循环
- 发票管理软件_财务人员都在用的这款发票管理软件,真的值得购买么?
- labuladong 的算法小抄_来自GitHub 68.8k star的硬核算法教程
- 简述计算机j选件,计算机组成原理06new.ppt
- 彻底理解js是单线程
- 重载运算符operator
- 打分现场流程策划及排练大致流程-仅参考
- 中国移动手机支付开放平台网站服务协议
- SVG-edit 是一个快速的、基于 Web 的、由 JavaScript 驱动的 SVG 绘图编辑器
- 智能语言处理之依存树计算句子结构相似度计算
- Flask接口服务处理全局异常
- 发表Nature等杂志四十多篇论文老师带您学单细胞测序数据挖掘和课题设计 2020年1月11-12日 上海...
- 自动化构建工具Grunt、Gulp
- ESP32 下载与烧录最新固件
- 如何解决Oracle11g使用dmp命令无法导出空表问题
- 如何在 iOS、MacOS 上使用 ChatGPT 和适用于 iPhone 的最佳 ChatGPT 应用程序