最近新学一个东西,叫LeakCanary,是square公司的产品,square公司出了很多的开源工具,比如:RxJava,Bufferknife等。
总结一下LeakCanary主要是检测应用有没有内存泄漏,然后使用MAT工具转换,并且把泄露的地方指示出来。
源码的下载地址: git clone git@github.com:square/leakcanary.git
下载之后,导入工程,选在leakcanary-sample安装即可。(注意默认的例子中,
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() //
.detectAll() //
.penaltyLog() //
.penaltyDialog() // 这里原来写的是penaltyDeath,改为penaltyDialog;否则会直接挂掉
.build());)
如果是想在自己的项目中导入:
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.1'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1'
// Optional, if you use support library fragments:
debugImplementation 'com.squareup.leakcanary:leakcanary-support-fragment:1.6.1'
}
然后一般在application的onCreate中添加
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(this);
// Normal app init code...
}
}
默认安装后,需要到应用管理中把所有的权限都打开,有存储权限、通知弹出的权限,还要允许通知的弹出,默认都是关闭的。
最后说一下,该检测工具的原理,有点儿类似获取ReferenceQueue,这个是java的一个特殊的类,回收时会把所有的将要回收的内容放入该queue中,可以从queue中打印出当前正在回收的对象。所以该检测工具可能可以通过检测该变量,查看是否有没有回收的内容,有的话就默认生成hprof文件,然后使用mat工具转化,并将获取出来得内容展示出来。
以上主要参考自:
https://www.jianshu.com/p/73260a46291c ReferenceQueue的使用
https://blog.csdn.net/sinat_20059415/article/details/79392633