android内存泄漏检测工具,Android内存泄漏的检测工具——LeakCanary

首先了解什么是内存泄露html

http://liuwangshu.cn/application/performance/ram-3-memory-leak.htmlandroid

1Leakcancary的优点

LeakCanary是一个可视化的内存泄露分析工具,他具有如下优点app

·简单:只需设置一段代码便可,打开应用运行一下就可以发现内存泄露。而MAT分析须要Heap Dump,获取文件,手动分析等多个步骤。ide

·易于发现问题:在手机端便可查看问题即引用关系,而MAT则须要你分析,找到Path To GC Roots等关系。工具

·人人可参与:开发人员,测试测试,产品经理基本上只要会用App就有可能发现问题。而传统的MAT方式,只有部分开发者才有精力和能力实施。测试

2.使用说明

2.1 在build.gradle中添加依赖gradle

首先,在必须在对应的app模块的gradle添加对应的库,在其余module模块添加无效ui

dependencies {

debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4'

releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'

}

到这里,就添加了对他的依赖。这里说明一下,使用其余版本可能会由于版本问题致使报错,建议使用最新版本,也就是这个1.5.4this

2.2 在application中配置spa

public class BaseApplication extends Application {

private RefWatcher refWatcher;

@Override

public void onCreate() {

super.onCreate();

refWatcher= setupLeakCanary();//2

}

private RefWatcher setupLeakCanary() {

if (LeakCanary.isInAnalyzerProcess(this)) {

return RefWatcher.DISABLED;

}

return LeakCanary.install(this);//1

}

public static RefWatcher getRefWatcher(Context context) {

BaseApplication leakApplication = (BaseApplication) context.getApplicationContext();

return leakApplication.refWatcher;

}

}

在注释2处,,完成对LeakCancary的安装,通过以上两个步骤,你的手机界面出现

4e67bc2003831a065a466464cd5c6af0.png

这个黄色的图标就是咱们的监控工具

2.3 检测activity内存泄漏问题,原理是application中监控着全部activity生命周期在activity的onDestory中

@Override

protected void onDestroy() {

super.onDestroy();

RefWatcher refWatcher = BaseApplication.getRefWatcher(this);//1

refWatcher.watch(this);

}

Activity生命周期结束的时候,若是你的activity发生内存泄漏,状态栏会提示你

bc3b48afd0ce64a8a1f7f9a940a07ae7.png

那么,黄色的应用  Leaks中

eda21cdba74673b2a2da37e82f0ee8c6.png

会把内存泄漏的详情告诉你,像这里就是由于个人TestActivity中开了LeakThread这个线程,形成了内存泄漏

泄漏内存是115kb

2.4 监控的对象当咱们须要对某个对象进行监控时,

BaseApplication.getRefWatcher().watch(sleaky)

其中sleaky就是咱们要检测的对象

那么,哪些是须要咱们检测的对象呢

默认状况下,是对Activity进行了检测。另外一个须要监控的重要对象就是Fragment实例。由于它和Activity实例同样可能持有大量的视图以及视图须要的资源

其余也能够监控的对象

BroadcastReceiver,Service,其余有生命周期的对象,直接间接持有大内存占用的对象(即Retained Heap值比较大的对象)

什么时候进行监控

首先,咱们须要明确什么是内存泄露,简而言之,某个对象在该释放的时候因为被其余对象持有没有被释放,于是形成了内存泄露。

所以,咱们监控也须要设置在对象(很快)被释放的时候,如Activity和Fragment的onDestroy方法。

一个错误示例,好比监控一个Activity,放在onCreate就会大错特错了,那么你每次都会收到Activity的泄露通知。

以上就是LeakCancary的使用方法

3.LeakCanary的原理

Android 应用的整个生命周期由其组件的生命周期组成,以下图中所示。用户使用应用的过程当中,在不一样界面之间跳转,每一个界面都经历着”生死“的转换,可在此创建检测点。Activity/Fragment 都有 onDestory() 回调方法, 进入此方法后,Activity/Fragment生命周期结束,应该被回收。

448118fff2c33e29a34db6b7e8a20f85.png

简述声明周期

而后咱们须要解决:如何获得未被回收的对象。ReferenceQueue+WeakReference+手动调用 GC可实现这个需求。

WeakReference 建立时,传入一个 ReferenceQueue 对象。当被 WeakReference 引用的对象的生命周期结束,一旦被 GC 检查到,GC 将会把该对象添加到 ReferenceQueue 中,待ReferenceQueue处理。当 GC 事后对象一直不被加入 ReferenceQueue,它可能存在内存泄漏。

f7d020bd81556ac055ba1ce59c2b377c.png

得到未被回收的 Object

找到了未被回收的对象,如何确认是否真的内存泄漏?这里能够将问题转换为:未被回收的对象,是否被其余对象引用?找出其最短引用链。VMDebug + HAHA 完成需求。

VM 会有堆内各个对象的引用状况,并能以hprof文件导出。HAHA 是一个由 square 开源的 Android 堆分析库,分析 hprof 文件生成Snapshot对象。Snapshot用以查询对象的最短引用链。

c4bd1f25058aaa3288895153f60ad037.png

解析hprof

找到最短引用链后,定位问题,排查代码将会事半功倍。

以下泳道图分析, LeakCanary 各个模块如何配合达到检测目的。

8a5e7df473d9f3c32ab76dc49cead723.png

泳道图

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值