Tools, 出來接活了--Android內存優化第三彈

tools

引言

前兩彈:
GC那些事兒
Android內存管理

欲善其事, 先利其器, 今天來聊聊那些內存分析工具.

1, 一圖看懂Memory Monitor

Memory Monitor 是 Android Studio內置的, 官方的內存監測工具. 圖形化的展示當前應用的內存狀態, 包括已分配內存, 空閑內存, 內存實時動態等.

Memory Monitor
  • 頂部矩形指示當前調試的設備以及應用進程.

  • 圖形區域:

    • 橫向時間軸, 內存檢測時間, 跟隨滾動.
    • 縱向內存軸, 內存使用量, 根據應用使用動態分配.
    • 藍色區域表示當前已分配使用的內存量.
    • 灰色區域表示剩余可使用的內存量.
    • 紅色圈圈指示的是系統GC事件(內存有一定量的回收).
  • 工具欄:

    • ① GC按鈕, 點擊執行一次GC操作.
    • ② Dump Java Heap按鈕, 點擊會在該調試工程的captures目錄生成一個類似這樣"com.anly.githubapp_2016.09.21_23.42.hprof"命名的hprof文件, 并打開Android Studio的HPROF Viewer顯示該文件內容.
    • ③ Allocation Traking按鈕, 點擊一次開始, 再次點擊結束, 同樣會在captrures目錄生成一個文件, 類似"com.anly.githubapp_2016.09.21_23.48.alloc", alloc后綴的文件, 并打開Allocation Tracker視圖展示該文件內容.

2, 使用HPROF Viewer & Analyzer來分析hprof文件

Memory Monitor通過Dump Java Heap可以生成一個hprof的文件, 這個文件是Android特定的Heap和CPU分析文件, 記錄了這段時間內的Java Heap變化.

2.1 關于Java Heap

由Java Heap文件可以看到如下數據:

  • 按類型顯示對象申請的內存快照(內存大小);
  • 每次自動或手動觸發GC時的樣本數據;
  • 協助定位可能發生的內存泄露點:
    • 所有已經被destroyed的activity, 還可以從GC Root訪問到.
    • 重復的String實例.

2.2 HPROF Viewer怎么看

還是用圖說話:

HPROF Viewer

HPROF Viewer分成三個大塊, 分別介紹下:

2.2.1 Class View

圖中標①的View.

顯示當前選中的Heap中的所有Class. 上方有兩個可選列表, 分別是用來選擇Heap區域, 和Class View的展示方式的.

Heap類型分為:

  • App Heap -- 當前App使用的Heap
  • Image Heap -- 磁盤上當前App的內存映射拷貝
  • Zygote Heap -- Zygote進程Heap(每個App進程都是從Zygote孵化出來的, 這部分基本是framework中的通用的類的Heap)

可選展示方式:

  • Class List View -- 類列表方式
  • Package Tree View -- 根據包結構的樹狀顯示
解釋
Class Name 類名
Total Count 該類的實例個數
Heap Count 選定的Heap中該實例的個數
Sizeof 每個該實例占用的內存大小
Shallow Size 所有該類的實例占用的內存大小
Retained Size 該類的所有實例可支配的內存大小

2.2.2 Instance View

圖中標②的View.
根據在Class View中選中的Class, 列表方式展示其所有實例的內存占用情況.

解釋
Instance 該類的實例
Depth 深度, 從任一GC Root點到該實例的最短跳數
Dominating Size 該實例可支配的內存大小

2.2.3 Reference Tree

圖中標③的View.
根據在Instance View中選中的實例, 顯示其引用關系樹.

此View中的列含義與Instance View一致.

在此View中可以右鍵點擊instance, 進入代碼:

Jump to Source

2.3 HPROF Analyzer

另外, 在HPROF Viewer的右側有一個"Analyzer Tasks"的按鈕, 點擊會進入HPROF Analyzer的hprof的分析界面:

HPROF Analyzer

分析任務包括:

  • 檢測泄露的Activity
  • 查找重復的String實例

點擊開始按鈕后, 會在Analysis Results區域顯示分析結果.

HPROF Viewer & Analyzer 可以用來對App的運行中的Java Heap做一個整體分析, 展示當前內存的具體到類和實例的分配情況, 以便檢測到可能的內存泄露和重復實例.

3, Allocation Tracker

HPROF Viewer & Analyzer是整體的, 那么Allocation Tracker則是針對操作的分析.

Allocation Tracker可以協助我們分析在一個特定操作時, 有哪些對象被分配內存了. 這可以很方便的讓我們知道方法調用的情況, 以便針對性的優化, 以提升性能和內存使用.

在Android Studio的Memory Monitor中點擊"Start Allocation Tracking", 在device中執行一個要分析的操作, 然后再次點擊. 如下所示:

Start Allocation Tracking

會生成一個alloc文件, 并打開:

Allocation Tracker

可以按照兩種方式展示:

  • Group by Method -- 按照線程方法分組顯示
  • Group by Allocator -- 按照包分組顯示

Method視圖中的列含義如下:

解釋
Method 方法
Count 該方法分配的實例總數
Size 該方法分配的內存總量(byte)

可以根據Count和Size分別排序, 找出產生實例多, 耗費內存多的方法, 結合代碼分析, 以提升其性能.

4, MAT

Eclipse MAT是一個快速且功能豐富的Java Heap分析工具, 可以幫助我們尋找內存泄露, 減少內存消耗.

MAT可以分析程序(成千上萬的對象產生過程中)生成的Heap dumps文件, 它會快速計算出對象的Retained Size, 來展示是哪些對象沒有被GC, 自動生成內存泄露疑點的報告.

具體MAT的使用請移步鄙人翻譯整理的MAT的使用手冊

5, LeakCanary

LeakCanary是大名鼎鼎的square出的一款開源的用來做內存泄露檢測的工具.

具體植入方式, 請參考LeakCanary README文檔, 略過.

App植入LeakCanary之后, 在檢測可能的內存泄露后, 會彈出Toast提示:

toast

并在測試手機桌面生成一個Leaks的icon:

leaks icon in launcher

點擊該icon進入Leaks界面, 可以比較清晰的看到內存泄露疑點:

6, adb shell dumpsys

在之前的一篇關于ADB使用的文中有聊到adb shell dumpsys命令, 該命令可以用戶輸出當前的系統狀態信息.

其中就有關于內存的選項:

$ adb shell dumpsys meminfo com.udinic.perfdemo

輸出信息如下:

meminfo

該命令常用來查看當前進程的的內存使用狀態, 是一個總體的預覽.

結語

正所謂善其事先利其器, 了解了內存分析工具的使用, 我們才能更好的分析內存問題, 從而得出解決方案或是明白從哪些方面去避免內存問題.

下一篇將以代碼實例形式來說明上面這些工具的具體使用, 敬請期待.


轉載請注明出處, 歡迎大家分享到朋友圈, 微博~

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

推薦閱讀更多精彩內容