android内存优化 内存泄露检测工具Leakcanary

1、添加依赖

debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.1'
        releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1'
        testImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1'

2、Application中注册
①这样,就万事俱备了! 在 debug build 中,如果检测到某个 activity 有内存泄露,LeakCanary 就是自动地显示一个通知。

  public class MyApplication extends Application {
    
  @Override public void onCreate() {
    super.onCreate();
    LeakCanary.install(this);
  }
}

②使用 RefWatcher 监控那些本该被回收的对象

public class MyApplication extends Application {
    private RefWatcher refWatcher;
    @Override
    public void onCreate() {
        super.onCreate();
        refWatcher= setupLeakCanary();
    }

private RefWatcher setupLeakCanary() {
    if (LeakCanary.isInAnalyzerProcess(this)) {
        return RefWatcher.DISABLED;
    }
    return LeakCanary.install(this);
}

public static RefWatcher getRefWatcher(Context context) {
    MyApplication leakApplication = (MyApplication ) context.getApplicationContext();
    return leakApplication.refWatcher;
    }
}

3、Activity和Fragment 中调用

public abstract class BaseFragment extends Fragment {

        @Override public void onDestroy() {
            super.onDestroy();
            RefWatcher refWatcher = MyApplication .getRefWatcher(getActivity());
            refWatcher.watch(this);
        }
    }

@Override
    protected void onDestroy() {
        super.onDestroy();
        RefWatcher refWatcher = LeakApplication.getRefWatcher(this);//1
        refWatcher.watch(this);
    }

4、
你的应用需要有写SD权限,因为LeakCanary需要生成hprof文件,保存在SD卡里面,因此你的应用要先申请权限
<!– SDCard中创建与删除文件权限 –>

<uses-permission android:name=“android.permission.MOUNT_UNMOUNT_FILESYSTEMS”/>

<!– 向SDCard写入数据权限 –>

<uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>

⑤、工作原理
①RefWatcher.watch() 创建一个 KeyedWeakReference 到要被监控的对象。

②然后在后台线程检查引用是否被清除,如果没有,调用GC。

③如果引用还是未被清除,把 heap 内存 dump 到 APP 对应的文件系统中的一个 .hprof 文件中。

④在另外一个进程中的 HeapAnalyzerService 有一个 HeapAnalyzer 使用HAHA 解析这个文件。

⑤得益于唯一的 reference key, HeapAnalyzer 找到 KeyedWeakReference,定位内存泄露。

⑥HeapAnalyzer 计算 到 GC roots 的最短强引用路径,并确定是否是泄露。如果是的话,建立导致泄露的引用链。

⑦引用链传递到 APP 进程中的 DisplayLeakService, 并以通知的形式展示出来。

方式原理:
① 触发检测
每次当Activity/Fragment执行完onDestroy生命周期,LeakCanary就会获取到这个Activity/Fragment,然后初始化RefWatcher对它进行分析,查看是否存在内存泄漏。
② 判断是否存在内存泄漏
首先尝试着从ReferenceQueue队列中获取待分析对象(软引用和弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用或弱引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用或弱引用加入到与之关联的引用队列中),如果不为空,那么说明正在被系统回收,如果直接就返回DONE,说明已经被系统回收了,如果没有被系统回收,可能存在内存泄漏,手动触发系统GC,然后再尝试移除待分析对象,如果还存在,说明存在内存泄漏。
③ 分析内存泄漏
确定有内存泄漏后,调用heapDumper.dumpHeap()生成.hprof文件目录。HAHA 是一个由 square 开源的 Android 堆分析库,分析 hprof 文件生成Snapshot对象。Snapshot用以查询对象的最短引用链。找到最短引用链后,定位问题,排查代码将会事半功倍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值