Android内存泄漏分析及实践(三)-leakCanary

Android内存泄漏分析及实践(三)-leakCanary

android应用程序本身系统分配的内存很少,一旦发生泄漏,程序很快就会变得非常卡顿,直至OOM崩溃。程序猿需要在Coding的时候注意静态变量的使用,以及注册监听器记得反注册,否则当程序出现内存泄露之后再去分析就变得相当困难。通过code review很难发现深层次的内存泄露问题。
当内存泄露真的出现了,我们可以借助工具去分析。常见的内存泄露分析工具有MAT和LeakCanary。

MAT和LeakCanary区别

MAT是一个非常出色的内存分析工具,但是使用非常麻烦,它是分析指定进程所有的对象,工具本身并不知道到底哪些对象出现了内存泄露,需要使用者(程序猿)分析得出。好处是不会有代码侵入性。

leakCanary是一个开源软件,在github地址为https://github.com/square/leakcanary。该工具包含debug和release两个版本。debug版本可以将泄露对象显示在DisplayLeakActivity中,而release不会展示,可以将泄露信息传送到指定服务器。要使用该工具,我们工程需要依赖leakCanary aar,并且需要修改我们的应用程序。LaekCanary只能监听Activity和Fragment内存泄露。

LeakCanary使用介绍

步骤1: 修改 build.gradle,使工程依赖leakCanary:

dependencies {
        compile 'com.squareup.leakcanary:leakcanary-android:1.3.1' 
        compile 'com.squareup.leakcanary:leakcanary-watcher:1.3.1'
    }

步骤2: 修改自定义Application,注册leakCanary:

public class ExampleApplication extends Application {
private static RefWatcher refWatcher;
  @Override public void onCreate() {
    super.onCreate();
    refWatcher = LeakCanary.install(this);
  }
  public static RefWatcher getRefWatcher() {
      return refWatcher;
  }
}

通过以上两步,leakCanary就能自动检测程序中所有Activity是否发生内存泄露。当检测到内存泄露,会通过通知栏通知用户,可以在DisplayLeakActivity中查看泄露信息,包括泄露对象,泄露内存大小,以及引用树。通过以上步骤我们仅仅能检测Activity,为了检测Fragment,我们需要创建一个父类BaseFragment extends Fragment,然后所有Fragment继承BaseFragment。

步骤3: 修改BaseFragment,检测fragment内存泄露

public class BaseFragment extends Fragment{
    @Override
    public void onDestroy() {
        super.onDestroy();
        RefWatcher refWatcher = DriverApplication.getRefWatcher();
        refWatcher.watch(this);
    }
}

通过以上三个步骤,leakCanary就可以自动检测Activity和Fragment了。最后附上一张内存泄露分析结果图片:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值