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

1、概述

Memory Profilers是分析內存工具的集合,它包括如下三部分:html

  • Memory Monitor Tool
  • Heap Viewer
  • Allocation Tracker

2、Memory Monitor

Memory MonitorAndroid Studio中自帶的內存檢測工具,它的做用有:android

  • 實時檢測應用的內存佔用狀況。
  • 檢測卡頓是不是因爲正在Gc引發。
  • 定位崩潰問題是否由內存問題引發。

這個工具位於Android Studio/Monitor一欄當中,前面咱們在介紹MAT的時候曾經使用過它,首先編寫一個簡單的demo,經過它能夠分配和回收內存:bash

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();
    }
}
複製代碼

  • 當咱們點擊alloc以後,內存不斷上漲。
  • 而當咱們點擊release以後,內存並不會馬上降低,而是須要點擊左邊的「垃圾車」按鈕來主動觸發垃圾回收,這時候能夠看到曲線馬上降低,說明此時觸發了垃圾回收過程。
  • 視圖中分爲兩個部分:
  • 深藍色:App當前使用的內存。
  • 淡藍色:已經分配給App,可是當前沒有使用的內存。
  • 當咱們不斷點擊alloc,最後就會拋出OOM異常錯誤:

3、Heap Viewer

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

它的使用方式很簡單,按照上圖的步驟進行操做就能夠了,須要特別注意的是,若是咱們但願得到最新的內存佔用狀況時,那麼須要作兩件事:

  • 保證2中的開關是打開的
  • 點擊5來觸發一次Gc,這樣才能獲得最新的內存使用狀況。

4、Allocation Tracker

Allocation Tracker是用來記錄一段時間內的內存分配狀況,而且它能夠列出分配對象的大小,以及是由哪一個函數分配的。 下面,咱們先看一下如何使用: 函數

其所處位置和上面的 Heap Viewer相似,其展示結果在 Heap的右邊,當咱們須要得到一段時間的內存分配,那麼須要如下幾步:

  • 點擊start Tracking
  • 操做App,這裏咱們點擊alloc按鈕分配一些Bitmap
  • 點擊Get Locations,得到從開始到結束的內存分配狀況

各列值的含義:工具

  • Alloc Order:分配的順序
  • Allocation Size:分配的大小
  • Allocated Class:分配對象的類名
  • Thread id:分配的線程id
  • Allocated in:分配到哪一個對象當中。

在整個區域的最下方,則是分配該對象的函數調用堆棧信息,這也是這個工具最有用的地方,經過它咱們就能夠分析出是代碼中哪一段邏輯致使了某個對象的分配。ui

5、小結

下面,咱們來總結一下這三個工具各自的特色:spa

Memory Monitor

  • 顯示內存佔用、分配和回收狀況。
  • 判斷GC是不是形成應用卡頓的緣由。
  • 判斷是不是因爲內存問題致使了App的崩潰。
  • 呈現的結果是實時的。
  • 可以有效地幫助分析內存泄露。
  • 定位Gc發生的時間,並分析這是不是合適的時間。
  • 沒有列出具體的分配對象。

Heap Viewer

  • 在垃圾回收發生時,呈現出某一時刻的內存快照。
  • 幫助咱們分析有多是哪一個對象引發了內存泄露。

Allocation Tracker

  • 分析出一段時間內對象的分配狀況,並列出是由什麼邏輯致使了這個對象的分配。
  • Heap Viwer一塊兒使用,來分析大對象產生的緣由。

6、參考文獻

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


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

相關文章
相關標籤/搜索