1. 程式人生 > >Mac Android 記憶體洩漏分析 實戰演練

Mac Android 記憶體洩漏分析 實戰演練

虛的概念就不講了,自己去網上搜,一大堆。  這裡來一次實戰演練

簡書上有一篇講解 記憶體洩漏分析 的文章,總結的很到位,由淺入深,比較全面。建議結合起來閱讀

預備知識:

1、Mac版 MAT 官網下載地址:  (也可以自行百度)

http://www.eclipse.org/downloads/download.php?file=/mat/1.7/rcp/MemoryAnalyzer-1.7.0.20170613-macosx.cocoa.x86_64.zip

2、 adb 重啟命令 

    adb kill-server

    adb start-server

開始正題:

1、執行 Android_SDK/tools/monitor, 介面如下。 如果啟動報錯,請關閉Android Studio、並保證手機正確連線電腦除錯、adb正常執行.

 當然 有些版本的 Android Studio 中也有快捷入口,自己去找


開啟後 點選 紅框中的按鈕,稍等大約 十幾秒到 幾十秒時間 後,會生成字尾後 .hprof 檔案,自己儲存下來  


2、轉換格式,執行 sdk 目錄 下的 Android_SDK/platform-tools/hprof-conv 可以執行檔案, 

輸入命令:hprof-conv <空格> -z <空格>  你第1步得到的.hprof檔案的路徑 <空格> 格式轉換後的檔名稱


執行完成後,會在當前目錄生成  bbbbbb 檔案(名稱可以自己修改),這個檔案 就可以用 MAT 工具開啟


3、下載MAC版本的 MAT 工具, 選單->File->Open Heap Dump, 開啟 bbbbb 檔案


可選的檔案格式 記得改為  All File, 所有檔案都能選擇


a、開啟後,點選 第1個圖示, 使用 histogram(翻譯 柱狀圖) 格式開啟,  方便檢視 各個 類 的 例項分佈情況


b、點選第2個位置輸入框 ,可以按 類名 來查詢 相應類的 例項分佈。  這裡可以看到 UserFavorFragment 類 有 3個例項, 共佔用記憶體 672KB(不包含成員變數所引用的物件的記憶體),

4、分析

  在第一行點 右鍵, 選擇"Merge Shortest Paths to GC Roots"-> exclude weak/soft references , 可以檢視 從 GCRoot  到這些 UserFavorFragment 例項的 最短路徑,   並且 不考慮 軟引用和弱引用, 因為這兩種引用 不影響GC,不會發生 記憶體洩漏.


可以看到這3個例項 的 引用路徑, 但只有 2條記錄, 有2個例項是被 同一個類的不同例項引用


完全開啟第2條記錄,可以看到 到底 是經過 怎樣的 依賴,導致  UserFavorFragment 不能被 GC回收,  找到不合理的引用,再從程式碼裡查詢  它是何時何處 被引用的 ,就能找到記憶體洩漏的 根本原因。    最後才是想辦法 修改程式碼,解決記憶體漏洩.


注意:這篇 文章 ,我們是 已經明確知道  UserFavorFragment 發生了漏洩,  實際我們如何確定 到底哪一塊位置 發生了洩漏,可以通過 縮小範圍的 方式 來確實, 如:開啟某個 Activity發現 記憶體瀑增,那嘗試不載入 某一塊業務邏輯,看看記憶體是否仍然暴增, 這樣不斷縮小範圍 就能確定是哪一個 類 發生  洩漏.