效能優化工具知識梳理(6) Memory Monitor & Heap Viewer & Allocation Tracker

澤毛發表於2017-12-21

一、概述

Memory Profilers是分析記憶體工具的集合,它包括以下三部分:

  • Memory Monitor Tool
  • Heap Viewer
  • Allocation Tracker

二、Memory Monitor

Memory MonitorAndroid Studio中自帶的記憶體檢測工具,它的作用有:

  • 實時檢測應用的記憶體佔用情況。
  • 檢測卡頓是否是由於正在Gc引起。
  • 定位崩潰問題是否由記憶體問題引起。

這個工具位於Android Studio/Monitor一欄當中,前面我們在介紹MAT的時候曾經使用過它,首先編寫一個簡單的demo,通過它可以分配和回收記憶體:

public class TrackerObject {

    List<Bitmap> mBitmaps = new ArrayList<>();

    public void allocBitmaps() {
        for (int i = 0; i < 100; i++) {
            Bitmap bitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
            mBitmaps.add(bitmap);
        }
    }

    public void releaseBitmaps() {
        for (Bitmap bitmap : mBitmaps) {
            bitmap.recycle();
        }
        mBitmaps.clear();
    }
}

public class TrackerActivity extends Activity {

    private TrackerObject mTrackerObject;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tracker);
        mTrackerObject = new TrackerObject();
    }

    public void alloc(View view) {
        mTrackerObject.allocBitmaps();
    }

    public void release(View view) {
        mTrackerObject.releaseBitmaps();
    }
}
複製程式碼

效能優化工具知識梳理(6)   Memory Monitor & Heap Viewer & Allocation Tracker

  • 當我們點選alloc之後,記憶體不斷上漲。
  • 而當我們點選release之後,記憶體並不會立刻下降,而是需要點選左邊的“垃圾車”按鈕來主動觸發垃圾回收,這時候可以看到曲線立刻下降,說明此時觸發了垃圾回收過程。
  • 檢視中分為兩個部分:
  • 深藍色:App當前使用的記憶體。
  • 淡藍色:已經分配給App,但是當前沒有使用的記憶體。
  • 當我們不斷點選alloc,最後就會丟擲OOM異常錯誤:
    效能優化工具知識梳理(6)   Memory Monitor & Heap Viewer & Allocation Tracker

三、Heap Viewer

Heap Viewer有點像是MAT的簡化版,它是Android Device Monitor中的一個工具:

效能優化工具知識梳理(6)   Memory Monitor & Heap Viewer & Allocation Tracker
它的使用方式很簡單,按照上圖的步驟進行操作就可以了,需要特別注意的是,如果我們希望獲得最新的記憶體佔用情況時,那麼需要做兩件事:

  • 保證2中的開關是開啟的
  • 點選5來觸發一次Gc,這樣才能得到最新的記憶體使用情況。

四、Allocation Tracker

Allocation Tracker是用來記錄一段時間內的記憶體分配情況,並且它可以列出分配物件的大小,以及是由哪個函式分配的。 下面,我們先看一下如何使用:

效能優化工具知識梳理(6)   Memory Monitor & Heap Viewer & Allocation Tracker
其所處位置和上面的Heap Viewer類似,其展現結果在Heap的右邊,當我們需要獲得一段時間的記憶體分配,那麼需要以下幾步:

  • 點選start Tracking
  • 操作App,這裡我們點選alloc按鈕分配一些Bitmap
  • 點選Get Locations,獲得從開始到結束的記憶體分配情況

各列值的含義:

  • Alloc Order:分配的順序
  • Allocation Size:分配的大小
  • Allocated Class:分配物件的類名
  • Thread id:分配的執行緒id
  • Allocated in:分配到哪個物件當中。

在整個區域的最下方,則是分配該物件的函式呼叫堆疊資訊,這也是這個工具最有用的地方,通過它我們就可以分析出是程式碼中哪一段邏輯導致了某個物件的分配。

五、小結

下面,我們來總結一下這三個工具各自的特點:

Memory Monitor

  • 顯示記憶體佔用、分配和回收情況。
  • 判斷GC是否是造成應用卡頓的原因。
  • 判斷是否是由於記憶體問題導致了App的崩潰。
  • 呈現的結果是實時的。
  • 能夠有效地幫助分析記憶體洩露。
  • 定位Gc發生的時間,並分析這是否是合適的時間。
  • 沒有列出具體的分配物件。

Heap Viewer

  • 在垃圾回收發生時,呈現出某一時刻的記憶體快照。
  • 幫助我們分析有可能是哪個物件引起了記憶體洩露。

Allocation Tracker

  • 分析出一段時間內物件的分配情況,並列出是由什麼邏輯導致了這個物件的分配。
  • Heap Viwer一起使用,來分析大物件產生的原因。

六、參考文獻

http://android.xsoftlab.net/tools/performance/comparison.html


更多文章,歡迎訪問我的 Android 知識梳理系列:

相關文章