LeakCanary实现原理

LeakCanary实现原理:

首先将Activity用弱引用(WeakReference)包装并绑定引用队列(ReferenceQueue),系统在gc的时候会优先回收弱引用,同时将要回收的引用放到引用队列中。所以只要判断引用队列中是否存在目标引用,就可以判断目标引用是否存在内存泄漏(如果存在则说明没有内存泄漏,反之则说明有内存泄漏)。
如何保证GC立即执行?

 GcTrigger DEFAULT = new GcTrigger() {
    @Override public void runGc() {
      // Code taken from AOSP FinalizationTest:
      // https://android.googlesource.com/platform/libcore/+/master/support/src/test/java/libcore/
      // java/lang/ref/FinalizationTester.java
      // System.gc() does not garbage collect every time. Runtime.gc() is
      // more likely to perform a gc.
      Runtime.getRuntime().gc();
      enqueueReferences();
      System.runFinalization();
    }

    private void enqueueReferences() {
      // Hack. We don't have a programmatic way to wait for the reference queue daemon to move
      // references to the appropriate queues.
      try {
        Thread.sleep(100);
      } catch (InterruptedException e) {
        throw new AssertionError();
      }
    }
  };

监测实现流程:

Application初始化 -> 注册ActivityLifecycleCallbacks ->在ActivityLifecycleCallbacks的onDestroy()中调用RefWatcher.watch()->watch()方法中判断是否存在内存泄漏,HeapDumper抓取dump文件并通过HeapAnalyzerService.runAnalysis分析-> 最后通过DisplayLeakService展示内存泄漏信息

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 核心是用RefWatcher在生命周期结束时实现监测,通过JVM弱引用和ReferenceQueue绑定的原理来捕...
    蓝灰_q阅读 3,599评论 1 0
  • LeakCanary是一个检测内存泄漏的工具,使用非常简单。主要用来检测Activity和Fragment内存泄漏...
    三木仔阅读 4,610评论 1 2
  • LeakCanary是一个在安卓平台上检测内存泄漏的工具库。 粗略的看了以下LeakCanary的实现原理。 Le...
    蜗牛的赛跑阅读 5,830评论 0 2
  • 相信很多人知道LeakCanay是square公司出的一个内存泄漏检测开源库,其使用也非常简单,在Applicat...
    jxiang112阅读 4,535评论 0 0
  • Android内存泄漏一直是困扰我们Android开发者的一个心病,由于开发人员对于知识掌握的不够深入或者代码的不...
    三叶梧桐阅读 5,727评论 0 11