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

引言

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

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

1, 一圖看懂Memory Monitor

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

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

  • 圖形區域:app

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

    • ① 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文件能夠看到以下數據:post

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

2.2 HPROF Viewer怎麼看

仍是用圖說話:
性能

-w1200

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, 進入代碼:

2.3 HPROF Analyzer

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

分析任務包括:

  • 檢測泄露的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中執行一個要分析的操做, 而後再次點擊. 以下所示:

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

能夠按照兩種方式展現:

  • 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提示:

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

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

6, adb shell dumpsys

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

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

$ adb shell dumpsys meminfo com.udinic.perfdemo複製代碼

輸出信息以下:

Snip20161025_19

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

結語

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

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


轉載請註明出處, 歡迎你們分享到朋友圈, 微博~

相關文章
相關標籤/搜索