1. 程式人生 > >Android記憶體洩露分析工具—Android Monitor

Android記憶體洩露分析工具—Android Monitor

記憶體洩露大家應該不會陌生了,通常是因為該被釋放的物件被佔用,不能及時對其釋放,導致GC無法正常回收。我們可以使用一些工具來監控和分析導致記憶體洩露的位置和原因。用Eclipse的同志應該都知道MAT(Memory Analysis Tools),Android Studio當然也不甘示弱,也有其強大的Android Monitor。

Android Monitor是Android Studio自帶的一個強大的效能分析工具,裡面一共包含5個模組:Logcat、Memory、CPU、Network、GPU

本文將針對Memory Monitor記憶體分析工具做簡單的講解

使用步驟

1,捕獲hprof檔案
這裡寫圖片描述

首先點選initiate GC,手動調去GC。接下來點選Dump Java Heap,稍等片刻,正在生成hprof檔案,該檔案存放在專案裡面的captures資料夾,每Dump一次將會獲取一個hprof檔案,該檔案可以直接使用Android Studio開啟進行分析。

2,執行分析hprof
當hprof檔案捕獲成功,as會自動開啟我們捕獲到的這個檔案,介面如下:
這裡寫圖片描述

接下來點選右上角的analyzer tasks將其展開,在點選綠色按鈕perform analysis,會執行分析hprof檔案

3,追蹤佔用

這裡寫圖片描述
點開leaked Activities選項卡,這裡面就是你的Activity記憶體洩露,選中其中一個Activity記憶體洩露,Reference Tree(圖中左上角)會展示對應的物件佔用的位置。

這裡寫圖片描述

上圖可以看到StaffManageActivity記憶體洩露,在Reference Tree裡面看到是因為TestSingleton類的mContext佔用,再往下看,instance才是罪魁禍首。這是單例模式造成的記憶體洩露

4,執行緒以及該執行緒的方法使用記憶體情況 (Allocaton Tracking)
這裡寫圖片描述

點選Start Allocaton Tracking(即上圖Allocaton Tracking)開始追蹤,再次點選Allocaton Tracking結束追蹤,這個時候會.alloc的檔案並且會自動開啟(這個過程可能需要等待一會兒,不要著急)

這裡寫圖片描述

我們可以看到這個介面,我是使用Volley請求網路了,可以在Thread 17執行緒裡面檢視到各種方法所佔用的記憶體大小以及百分比

5,Enabled按鈕可以關閉和開啟記憶體監控

記憶體抖動

1.介紹:記憶體抖動是因為大量的物件被建立又在短時間內馬上被釋放,瞬間產生大量的物件會嚴重佔用YoungGeneration的記憶體區域,當達到閥值,剩餘空間不夠的時候,也會觸發GC。即使每次分配的物件佔用了很少的記憶體,但是他們疊加在一起會增加Heap的壓力,從而觸發更多其他型別的GC。這個操作有可能會影響到幀率,並使得使用者感知到效能問題。簡單的說,也就是可能會造成介面卡頓現象。
2.方法:如果你在Memory Monitor裡面檢視到短時間發生了多次記憶體的漲跌,這意味著很有可能發生了記憶體抖動。如下圖
這裡寫圖片描述

我這裡的記憶體抖動是拼接字串造成的記憶體抖動

   String sb = "";
   for (int i = 0; i < 10000; i++) {
       sb += i+" ";
   }