一、概述
Memory Profilers
是分析記憶體工具的集合,它包括以下三部分:
Memory Monitor Tool
Heap Viewer
Allocation Tracker
二、Memory Monitor
Memory Monitor
是Android 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();
}
}
複製程式碼
- 當我們點選
alloc
之後,記憶體不斷上漲。 - 而當我們點選
release
之後,記憶體並不會立刻下降,而是需要點選左邊的“垃圾車”按鈕來主動觸發垃圾回收,這時候可以看到曲線立刻下降,說明此時觸發了垃圾回收過程。 - 檢視中分為兩個部分:
- 深藍色:
App
當前使用的記憶體。 - 淡藍色:已經分配給
App
,但是當前沒有使用的記憶體。 - 當我們不斷點選
alloc
,最後就會丟擲OOM
異常錯誤:
三、Heap Viewer
Heap Viewer
有點像是MAT
的簡化版,它是Android Device Monitor
中的一個工具:
- 保證
2
中的開關是開啟的 - 點選
5
來觸發一次Gc
,這樣才能得到最新的記憶體使用情況。
四、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
:分配到哪個物件當中。
在整個區域的最下方,則是分配該物件的函式呼叫堆疊資訊,這也是這個工具最有用的地方,通過它我們就可以分析出是程式碼中哪一段邏輯導致了某個物件的分配。
五、小結
下面,我們來總結一下這三個工具各自的特點:
Memory Monitor
- 顯示記憶體佔用、分配和回收情況。
- 判斷
GC
是否是造成應用卡頓的原因。 - 判斷是否是由於記憶體問題導致了
App
的崩潰。 - 呈現的結果是實時的。
- 能夠有效地幫助分析記憶體洩露。
- 定位
Gc
發生的時間,並分析這是否是合適的時間。 - 沒有列出具體的分配物件。
Heap Viewer
- 在垃圾回收發生時,呈現出某一時刻的記憶體快照。
- 幫助我們分析有可能是哪個物件引起了記憶體洩露。
Allocation Tracker
- 分析出一段時間內物件的分配情況,並列出是由什麼邏輯導致了這個物件的分配。
- 和
Heap Viwer
一起使用,來分析大物件產生的原因。
六、參考文獻
http://android.xsoftlab.net/tools/performance/comparison.html
更多文章,歡迎訪問我的 Android 知識梳理系列:
- Android 知識梳理目錄:www.jianshu.com/p/fd82d1899…
- 個人主頁:lizejun.cn
- 個人知識總結目錄:lizejun.cn/categories/