LeakCanary原理

要觀察一個對象是否泄漏逾滥,通過調(diào)用RefWatcher的watch方法酣倾,會創(chuàng)建一個KeyedWeakReference诅炉,并關(guān)聯(lián)一個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是否被回收箩帚,如果被回收夺艰,返回,如果沒被回收富寿,觸發(fā)一次gc睬隶,然后再次檢查是否被回收,如果沒被回收页徐,說明是有泄漏了苏潜,做一次heapdump進行分析。

在heapdump中查找keyedweakreference变勇,然后看keyedWeakreference的key是否與生成heapdump的key相同恤左,然后分析leak 的最短路徑。

從leakcanary的源代碼中可以看出搀绣,gc root的類型

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末飞袋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子链患,更是在濱河造成了極大的恐慌授嘀,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锣险,死亡現(xiàn)場離奇詭異蹄皱,居然都是意外死亡,警方通過查閱死者的電腦和手機芯肤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門巷折,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人崖咨,你說我怎么就攤上這事锻拘。” “怎么了击蹲?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵署拟,是天一觀的道長。 經(jīng)常有香客問我歌豺,道長推穷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任类咧,我火速辦了婚禮馒铃,結(jié)果婚禮上蟹腾,老公的妹妹穿的比我還像新娘。我一直安慰自己区宇,他們只是感情好娃殖,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著议谷,像睡著了一般炉爆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卧晓,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天芬首,我揣著相機與錄音,去河邊找鬼禀崖。 笑死衩辟,一個胖子當著我的面吹牛螟炫,可吹牛的內(nèi)容都是我干的波附。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼昼钻,長吁一口氣:“原來是場噩夢啊……” “哼掸屡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起然评,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤仅财,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碗淌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盏求,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年亿眠,在試婚紗的時候發(fā)現(xiàn)自己被綠了碎罚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡纳像,死狀恐怖荆烈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竟趾,我是刑警寧澤憔购,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站岔帽,受9級特大地震影響玫鸟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜犀勒,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一鞋邑、第九天 我趴在偏房一處隱蔽的房頂上張望诵次。 院中可真熱鬧,春花似錦枚碗、人聲如沸逾一。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遵堵。三九已至,卻和暖如春怨规,著一層夾襖步出監(jiān)牢的瞬間陌宿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工波丰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留壳坪,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓掰烟,卻偏偏與公主長得像爽蝴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纫骑,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 相信很多人知道LeakCanay是square公司出的一個內(nèi)存泄漏檢測開源庫蝎亚,其使用也非常簡單,在Applicat...
    jxiang112閱讀 939評論 0 0
  • 前些天先馆,有人問到 “開發(fā)過程中常見的內(nèi)存泄漏都有哪些发框?”,一時脫口而出:靜態(tài)的對象中(包括單例)持有一個生命周期較...
    常興E站閱讀 3,831評論 5 62
  • 本文主要內(nèi)容 1煤墙、Reference 簡介 2梅惯、LeakCanary 使用 3、LeakCanary 源碼分析 L...
    某昆閱讀 3,567評論 3 6
  • 1.LeakCanary簡介 LeakCanary是Square公司開源的內(nèi)存泄露檢測工具仿野。github:Leak...
    碼上述Andy閱讀 1,849評論 0 2
  • Android內(nèi)存泄漏一直是困擾我們Android開發(fā)者的一個心病铣减,由于開發(fā)人員對于知識掌握的不夠深入或者代碼的不...
    三葉梧桐閱讀 1,792評論 0 11