LeakCanary實(shí)現(xiàn)原理

LeakCanary實(shí)現(xiàn)原理:

首先將Activity用弱引用(WeakReference)包裝并綁定引用隊(duì)列(ReferenceQueue),系統(tǒng)在gc的時(shí)候會(huì)優(yōu)先回收弱引用,同時(shí)將要回收的引用放到引用隊(duì)列中。所以只要判斷引用隊(duì)列中是否存在目標(biāo)引用,就可以判斷目標(biāo)引用是否存在內(nèi)存泄漏(如果存在則說明沒有內(nèi)存泄漏,反之則說明有內(nèi)存泄漏)。
如何保證GC立即執(zhí)行?

 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();
      }
    }
  };

監(jiān)測(cè)實(shí)現(xiàn)流程:

Application初始化 -> 注冊(cè)ActivityLifecycleCallbacks ->在ActivityLifecycleCallbacks的onDestroy()中調(diào)用RefWatcher.watch()->watch()方法中判斷是否存在內(nèi)存泄漏,HeapDumper抓取dump文件并通過HeapAnalyzerService.runAnalysis分析-> 最后通過DisplayLeakService展示內(nèi)存泄漏信息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 核心是用RefWatcher在生命周期結(jié)束時(shí)實(shí)現(xiàn)監(jiān)測(cè),通過JVM弱引用和ReferenceQueue綁定的原理來捕...
    藍(lán)灰_q閱讀 612評(píng)論 1 0
  • LeakCanary是一個(gè)檢測(cè)內(nèi)存泄漏的工具,使用非常簡(jiǎn)單。主要用來檢測(cè)Activity和Fragment內(nèi)存泄漏...
    三木仔閱讀 1,182評(píng)論 1 2
  • LeakCanary是一個(gè)在安卓平臺(tái)上檢測(cè)內(nèi)存泄漏的工具庫。 粗略的看了以下LeakCanary的實(shí)現(xiàn)原理。 Le...
    蝸牛的賽跑閱讀 2,009評(píng)論 0 2
  • 相信很多人知道LeakCanay是square公司出的一個(gè)內(nèi)存泄漏檢測(cè)開源庫,其使用也非常簡(jiǎn)單,在Applicat...
    jxiang112閱讀 1,066評(píng)論 0 0
  • Android內(nèi)存泄漏一直是困擾我們Android開發(fā)者的一個(gè)心病,由于開發(fā)人員對(duì)于知識(shí)掌握的不夠深入或者代碼的不...
    三葉梧桐閱讀 1,858評(píng)論 0 11

友情鏈接更多精彩內(nèi)容