性能優化工具知識梳理(1) - TraceView
性能優化工具知識梳理(2) - Systrace
性能優化工具知識梳理(3) - 調試GPU過度繪制 & GPU呈現模式分析
性能優化工具知識梳理(4) - Hierarchy Viewer
性能優化工具知識梳理(5) - MAT
性能優化工具知識梳理(6) - Memory Monitor & Heap Viewer & Allocation Tracker
性能優化工具知識梳理(7) - LeakCanary
性能優化工具知識梳理(8) - Lint
一、概述
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 知識梳理目錄:http://www.lxweimin.com/p/fd82d18994ce
- 個人主頁:http://lizejun.cn
- 個人知識總結目錄:http://lizejun.cn/categories/