LeakCanary淺析

? ? ? 說到內存泄漏脸哀,就必須提到LeakCanary. 這個利器图筹,很方便的顯示出內存泄漏的地方篇裁。在用到的過程中好奇怎么做到的,下面跟著網(wǎng)上的博客簡單的分析下LeakCanary源碼吵护。


? ?源碼分析

1. 注冊

使用很簡單盒音,關鍵的一行代碼“LeakCanary.install(this)”;下面就以這行代碼為線索分析。

構建一個AndroidRefWatcherBuilder的對象馅而。

而AndroidRefWatcherBuilder繼承自RefWatcherBuilder祥诽。

創(chuàng)建的實際是子類對象,因此后續(xù)調用的都是子類的方法瓮恭,除非子類不存在雄坪,則會調用父類的方法。

而傳進去的參數(shù)DisplayService.這個類是用于內存泄漏后的展示偎血。

這個是創(chuàng)建那些需要去除的引用诸衔,因為有些內存泄漏是已知,且是系統(tǒng)層級的颇玷。因此判斷是否內存泄漏的時候需要排除笨农。這個也可以手動增加,比如這個類的泄漏不嚴重帖渠,但改起來代價太大谒亦,就可以手動將這個類放進去。

最后調用這個方法空郊,關鍵的地方在于build()這個方法份招,通過建造者設計模式設置參數(shù)。因為前面創(chuàng)建的是子類對象狞甚,因此調用方法時會優(yōu)先調用子類的方法锁摔。另外值得注意的是最后new RefWatcher時,會去創(chuàng)建一個Disabled的父類的對象哼审,也會去調用build()方法谐腰。

enableDisplayLeakActivity 這個用來控制內存泄漏圖標的顯示與否孕豹。

注冊activity的ActivityLifecycleCallbacks. 這樣就可以在activity的ondestroy方法中執(zhí)行內存泄漏的檢查。其實可以從此處看出LeakCanary 的缺點十气,一個是只能檢測到activity的內存泄漏励背,另一個是只能檢測非前臺的activity的內存泄漏。比如service 的內存泄漏就檢測不到砸西。

2 檢測

當activity 執(zhí)行到ondestroy 方法時叶眉,會回調ActivityLifecycleCallbacks.

然后開始進行內存泄漏的檢查,一路跟進去關鍵代碼如下:

而這個watchExcuter 則是在最開始install 的時候通過builder 方法創(chuàng)建芹枷。實際如下

關鍵代碼如下

Retryable 實際上是一個runnable對象衅疙。可以看到execute的retryable,最后都會在主進程中執(zhí)行杖狼。

而MessageQueue.IdleHandler可以用來在線程空閑的時候炼蛤,指定一個操作妖爷,使用IdleHandler的好處在于可以不用指定一個將來時間蝶涩,只要線程空閑了,就可以執(zhí)行它指定的操作絮识。

這個是界面跳轉后內存泄漏的檢查需要稍等下的原因之一绿聘。另外一個原因可能是生成分析dump文件比較費時。

接下來回頭看ensuregone方法

removeWeaklyReachableReferences方法會需要試著移除弱引用次舌,如果移除后的集合中不包括activity的引用對象熄攘。則說明沒有泄漏,否則就需要手動gc, 然后通過removeWeaklyReachableReferences檢查gc后 彼念。如果此時集合中還有activity對應的引用對象挪圾,就說明內存泄漏了。否則就不認為發(fā)生內存泄漏逐沙。如果發(fā)生內存泄漏哲思,接下來就需要檢測出到底什么地方發(fā)生了泄漏。

此時的heapDumper也是最開始install的時候通過build()方法構造的吩案。

這個地方是調用的系統(tǒng)的Debug類的dumpHprofData棚赔,來生成dump文件,文件名就是傳進去的參數(shù)徘郭。值得深挖的是Debug這個類靠益,有很多有用的幫助調試的方法。

生成文件之后 然后會走到heapDumpListener残揉。通過analyze 開始正式對dump文件分析胧后。

然后就調到HeapAnalyzerService的runAnalysis方法。HeapAnalyzerService是一個intentservice類抱环,執(zhí)行結束壳快,這個service會自動銷毀途样。然后runAnalysis調用到onHandleIntent 方法中去。需要注意的是濒憋,因為HeapAnalyzerService在manifest中是標記的另外的進程何暇,所以此處雖然是startservice,這樣啟動service,但啟動的service 運行在新的進程中凛驮。

HeapAnalyzer會使用checkForLeak的方法來分析內存泄露結果裆站。

這里又個值得注意的地方是,老版本的LeakCanary使用的是eclipse.mat 這個包來分析的黔夭。而新版本的則是使用的squaredup的haha庫宏胯。

此處也是跨進程調用的。然后結果就會傳給最開始的displayleakservice本姥。然后就會發(fā)通知到通知欄肩袍。然后開發(fā)者就可以很方便的點進去看到相關的內存泄漏了。

3 總結

一路下來婚惫,代碼并不是很難氛赐,不過多看幾遍就會有收獲的。有如下知識點:

ActivityLifecyleCallbacks的使用

弱引用及referenceQueu的使用

builder 構造者設計模式

簡單的startservice 跨進程通信

MessageQueue.IdleHandler可以用來在線程空閑的時候先舷,指定一個操作

Debug輔助調試類艰管。


引用

http://www.reibang.com/p/481775d198f0

這篇文章講的很好,基本上就是自己想說的蒋川,截圖什么的都是來自這篇文章牲芋。感謝分享。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末捺球,一起剝皮案震驚了整個濱河市缸浦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌氮兵,老刑警劉巖裂逐,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胆剧,居然都是意外死亡絮姆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門秩霍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篙悯,“玉大人,你說我怎么就攤上這事铃绒「胝眨” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵颠悬,是天一觀的道長矮燎。 經(jīng)常有香客問我定血,道長,這世上最難降的妖魔是什么诞外? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任澜沟,我火速辦了婚禮,結果婚禮上峡谊,老公的妹妹穿的比我還像新娘茫虽。我一直安慰自己,他們只是感情好既们,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布濒析。 她就那樣靜靜地躺著,像睡著了一般啥纸。 火紅的嫁衣襯著肌膚如雪号杏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天斯棒,我揣著相機與錄音盾致,去河邊找鬼。 笑死名船,一個胖子當著我的面吹牛绰上,可吹牛的內容都是我干的。 我是一名探鬼主播渠驼,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鉴腻!你這毒婦竟也來了迷扇?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤爽哎,失蹤者是張志新(化名)和其女友劉穎蜓席,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體课锌,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡厨内,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了渺贤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雏胃。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖志鞍,靈堂內的尸體忽然破棺而出瞭亮,到底是詐尸還是另有隱情,我是刑警寧澤固棚,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布统翩,位于F島的核電站仙蚜,受9級特大地震影響,放射性物質發(fā)生泄漏厂汗。R本人自食惡果不足惜委粉,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娶桦。 院中可真熱鬧艳丛,春花似錦、人聲如沸趟紊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霎匈。三九已至戴差,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铛嘱,已是汗流浹背暖释。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留墨吓,地道東北人球匕。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像帖烘,于是被迫代替她去往敵國和親亮曹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,152評論 25 707
  • LeakCanary原理淺析 1.LeakCanary簡介 LeakCanary是一個Android和Java的內...
    chewbee閱讀 6,821評論 2 38
  • 導入Reactivecocoa框架秘症,導入失敗在podfile加入use_frameworks使用的時候 #impo...
    走停2015_iOS開發(fā)閱讀 456評論 0 0
  • 好多人照卦,都會在跨年的時候來回首過往一年,展望接下來的這年乡摹。我役耕,不太喜歡用文字記錄著回首,因為目前階段我還沒有做出什...
    壹平方閱讀 186評論 0 0
  • block已經(jīng)成為我在iOS編寫中最為常用的回調方法 , 它簡單便捷 , 取代了代理大部分的工作 , 今天整理一下...
    存在即是美閱讀 282評論 0 0