使用android profiler和mat工具檢測內存泄漏

android中產生內存泄漏的原因很多,比如廣播未注銷,handler使用不當,Activity的context被單例引用等。規范編碼可以避免很多內存泄漏問題,本文對引起內存泄漏的原因不做深入討論,只記錄如何使用android studio和mat工具分析內存泄漏,解決問題。

android studio提供了profiler幫助開發者監測內存。打開AS,跑起項目可以看到這樣的界面

點擊Android Profiler打開性能分析界面

注意選擇你要分析的設備和進程。這里除了內存分析,還可以進行CPU和網絡的分析檢測。點擊圖中藍色的內存區域,進入內存分析界面

圖中顯示的就是當前進程的內存使用情況,點擊左上角的垃圾桶按鈕可以觸發一次GC,如果內存沒有泄露,理想狀態下,界面反復跳轉之后GC內存應該可以回到初始狀態(允許小幅度上升),如果發現跳轉到某個頁面再回來發現GC無法回收內存,反復跳轉后內存持續上升且無法回收,則說明該頁面肯定發生了內存泄漏。

操作你的app,跳轉到某個要測試的界面然后返回,連續操作幾次后返回初始界面,手動進行一次垃圾回收(圖中垃圾桶按鈕),點擊上圖的箭頭按鈕記錄一段內存信息,點擊后幾秒鐘會自動完成記錄,完成后出現以下界面?

這就是當前app中所有代碼占用內存的情況,可以選擇Arrayge by class選擇查看方式,一般選擇包名查看方式可以方便找到自己的代碼,查看代碼中的對象實例個數,要想更準確的分析內存情況就要使用其他工具協助——mat(Memory Analyzer)。點擊上圖左邊按鈕導出內存信息以備mat分析使用,直接導出的hprof文件在eclipse的mat工具中是不能直接打開的,需要轉換一下,轉換過程也很簡單,使用SDK自帶的hprof工具即可:cmd定位到你的SDK路徑下的platform-tools文件夾,使用命令 hprof-conv D:\memory\a1.hprof D:\memory\b1.hprof 轉換,D:\memory\a1.hprof是剛才保存的源文件路徑,D:\memory\b1是要保存的轉換后的文件路徑。mat工具官網下載地址https://www.eclipse.org/mat/downloads.php百度云盤地址鏈接:https://pan.baidu.com/s/1sa2mZ1xNnWEeq0BidXIerw提取碼:t8ns? ? 下載解壓后打開一個Eclipse形狀的MemoryAnalyzer.exe。界面打開后是這樣的

點擊file->open heap dump導入剛才轉換后的文件


點擊打開Histogram視圖查看類詳情


輸入你認為可能內存泄漏的類名可以看到,這個Fragment有兩個實例,但是不能就確定是發生了內存泄漏,因為可能包含若引用和軟引用的對象實例,而這些是可以被回收的,要想查看真正無法被回收的實例個數:右鍵選擇去掉弱、軟、虛等引用后的實例

打開后的視圖就是真正的內存泄漏的情況

可以看到這個對象確實存在有兩個實例無法被銷毀(我測試的時候跳轉了兩次這個界面)這就說明我們的代碼確實發生了內存泄露,mat工具中雖然無法明確告訴我們哪一行代碼發生了內存泄露,卻可以告訴我們是什么引起的,從圖中可以看到是Rxbus引起的,查看該類中的代碼發現Rxbus使用后沒有注銷,導致全局的消息隊列中一直持有該fragment實例的引用,GC做回收時,會根據回收算法分析該對象的引用鏈,回收引用不可達的對象,如果不再使用的對象仍然存在引用鏈中則無法被回收,這就是發生了內存泄漏的對象。添加注銷代碼重新分析后發現剛才發生泄漏的fragment強引用實例變成了零。這樣就解決了這個內存泄漏問題。關于mat的其他使用方式,感興趣的可以去看官網介紹或者其他介紹文章。

這只是一個簡單的內存泄漏例子,實際開發中的內存泄露往往要復雜的多,但是根據這樣的分析過程,可以定位大部分內存泄漏問題。需要注意的是,良好的編碼習慣是避免內存泄漏最好的方式。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容