LeakCanary原理

要观察一个对象是否泄漏,通过调用RefWatcher的watch方法,会创建一个KeyedWeakReference,并关联一个refenceQueue:

public void watch(Object watchedReference, String referenceName) {
    ......

    String key = UUID.randomUUID().toString();
    retainedKeys.add(key);
    final KeyedWeakReference reference =
        new KeyedWeakReference(watchedReference, key, referenceName, queue);

    watchExecutor.execute(new Runnable() {
      @Override public void run() {
        ensureGone(reference, watchStartNanoTime);
      }
    });
  }

在ensureGone里

void ensureGone(KeyedWeakReference reference, long watchStartNanoTime) {
    ....
    removeWeaklyReachableReferences();
    if (gone(reference) || debuggerControl.isDebuggerAttached()) {
      return;
    }
    gcTrigger.runGc();
    removeWeaklyReachableReferences();
    if (!gone(reference)) {
      long startDumpHeap = System.nanoTime();
      long gcDurationMs = NANOSECONDS.toMillis(startDumpHeap - gcStartNanoTime);

      File heapDumpFile = heapDumper.dumpHeap();

      if (heapDumpFile == HeapDumper.NO_DUMP) {
        // Could not dump the heap, abort.
        return;
      }
      long heapDumpDurationMs = NANOSECONDS.toMillis(System.nanoTime() - startDumpHeap);
      heapdumpListener.analyze(
          new HeapDump(heapDumpFile, reference.key, reference.name, excludedRefs, watchDurationMs,
              gcDurationMs, heapDumpDurationMs));
    }
  }

检查keyedweakreference是否被回收,如果被回收,返回,如果没被回收,触发一次gc,然后再次检查是否被回收,如果没被回收,说明是有泄漏了,做一次heapdump进行分析。

在heapdump中查找keyedweakreference,然后看keyedWeakreference的key是否与生成heapdump的key相同,然后分析leak 的最短路径。

从leakcanary的源代码中可以看出,gc root的类型

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

推荐阅读更多精彩内容

  • 相信很多人知道LeakCanay是square公司出的一个内存泄漏检测开源库,其使用也非常简单,在Applicat...
    jxiang112阅读 4,545评论 0 0
  • 前些天,有人问到 “开发过程中常见的内存泄漏都有哪些?”,一时脱口而出:静态的对象中(包括单例)持有一个生命周期较...
    常兴E站阅读 9,331评论 5 62
  • 本文主要内容 1、Reference 简介 2、LeakCanary 使用 3、LeakCanary 源码分析 L...
    某昆阅读 8,959评论 3 6
  • 1.LeakCanary简介 LeakCanary是Square公司开源的内存泄露检测工具。github:Leak...
    码上述Andy阅读 5,837评论 0 2
  • Android内存泄漏一直是困扰我们Android开发者的一个心病,由于开发人员对于知识掌握的不够深入或者代码的不...
    三叶梧桐阅读 5,731评论 0 11