性能優(yōu)化工具知識(shí)梳理(1) - TraceView
性能優(yōu)化工具知識(shí)梳理(2) - Systrace
性能優(yōu)化工具知識(shí)梳理(3) - 調(diào)試GPU過度繪制 & GPU呈現(xiàn)模式分析
性能優(yōu)化工具知識(shí)梳理(4) - Hierarchy Viewer
性能優(yōu)化工具知識(shí)梳理(5) - MAT
性能優(yōu)化工具知識(shí)梳理(6) - Memory Monitor & Heap Viewer & Allocation Tracker
性能優(yōu)化工具知識(shí)梳理(7) - LeakCanary
性能優(yōu)化工具知識(shí)梳理(8) - Lint
一、概述
Memory Profilers
是分析內(nèi)存工具的集合,它包括以下三部分:
Memory Monitor Tool
Heap Viewer
Allocation Tracker
二铭腕、Memory Monitor
Memory Monitor
是Android Studio
中自帶的內(nèi)存檢測(cè)工具,它的作用有:
- 實(shí)時(shí)檢測(cè)應(yīng)用的內(nèi)存占用情況多糠。
- 檢測(cè)卡頓是否是由于正在
Gc
引起累舷。 - 定位崩潰問題是否由內(nèi)存問題引起。
這個(gè)工具位于Android Studio/Monitor
一欄當(dāng)中夹孔,前面我們?cè)诮榻BMAT
的時(shí)候曾經(jīng)使用過它被盈,首先編寫一個(gè)簡(jiǎn)單的demo
,通過它可以分配和回收內(nèi)存:
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();
}
}
- 當(dāng)我們點(diǎn)擊
alloc
之后搭伤,內(nèi)存不斷上漲只怎。 - 而當(dāng)我們點(diǎn)擊
release
之后,內(nèi)存并不會(huì)立刻下降怜俐,而是需要點(diǎn)擊左邊的“垃圾車”按鈕來主動(dòng)觸發(fā)垃圾回收身堡,這時(shí)候可以看到曲線立刻下降,說明此時(shí)觸發(fā)了垃圾回收過程拍鲤。 - 視圖中分為兩個(gè)部分:
- 深藍(lán)色:
App
當(dāng)前使用的內(nèi)存贴谎。 - 淡藍(lán)色:已經(jīng)分配給
App
,但是當(dāng)前沒有使用的內(nèi)存季稳。 - 當(dāng)我們不斷點(diǎn)擊
alloc
擅这,最后就會(huì)拋出OOM
異常錯(cuò)誤:
三、Heap Viewer
Heap Viewer
有點(diǎn)像是MAT
的簡(jiǎn)化版景鼠,它是Android Device Monitor
中的一個(gè)工具:
它的使用方式很簡(jiǎn)單仲翎,按照上圖的步驟進(jìn)行操作就可以了,需要特別注意的是铛漓,如果我們希望獲得最新的內(nèi)存占用情況時(shí)溯香,那么需要做兩件事:
- 保證
2
中的開關(guān)是打開的 - 點(diǎn)擊
5
來觸發(fā)一次Gc
,這樣才能得到最新的內(nèi)存使用情況票渠。
四逐哈、Allocation Tracker
Allocation Tracker
是用來記錄一段時(shí)間內(nèi)的內(nèi)存分配情況,并且它可以列出分配對(duì)象的大小问顷,以及是由哪個(gè)函數(shù)分配的昂秃。
下面,我們先看一下如何使用:
其所處位置和上面的
Heap Viewer
類似杜窄,其展現(xiàn)結(jié)果在Heap
的右邊肠骆,當(dāng)我們需要獲得一段時(shí)間的內(nèi)存分配,那么需要以下幾步:
- 點(diǎn)擊
start Tracking
- 操作
App
塞耕,這里我們點(diǎn)擊alloc
按鈕分配一些Bitmap
- 點(diǎn)擊
Get Locations
蚀腿,獲得從開始到結(jié)束的內(nèi)存分配情況
各列值的含義:
-
Alloc Order
:分配的順序 -
Allocation Size
:分配的大小 -
Allocated Class
:分配對(duì)象的類名 -
Thread id
:分配的線程id
-
Allocated in
:分配到哪個(gè)對(duì)象當(dāng)中。
在整個(gè)區(qū)域的最下方,則是分配該對(duì)象的函數(shù)調(diào)用堆棧信息莉钙,這也是這個(gè)工具最有用的地方廓脆,通過它我們就可以分析出是代碼中哪一段邏輯導(dǎo)致了某個(gè)對(duì)象的分配。
五磁玉、小結(jié)
下面停忿,我們來總結(jié)一下這三個(gè)工具各自的特點(diǎn):
Memory Monitor
- 顯示內(nèi)存占用、分配和回收情況蚊伞。
- 判斷
GC
是否是造成應(yīng)用卡頓的原因席赂。 - 判斷是否是由于內(nèi)存問題導(dǎo)致了
App
的崩潰。 - 呈現(xiàn)的結(jié)果是實(shí)時(shí)的时迫。
- 能夠有效地幫助分析內(nèi)存泄露颅停。
- 定位
Gc
發(fā)生的時(shí)間,并分析這是否是合適的時(shí)間掠拳。 - 沒有列出具體的分配對(duì)象癞揉。
Heap Viewer
- 在垃圾回收發(fā)生時(shí),呈現(xiàn)出某一時(shí)刻的內(nèi)存快照碳想。
- 幫助我們分析有可能是哪個(gè)對(duì)象引起了內(nèi)存泄露烧董。
Allocation Tracker
- 分析出一段時(shí)間內(nèi)對(duì)象的分配情況,并列出是由什么邏輯導(dǎo)致了這個(gè)對(duì)象的分配胧奔。
- 和
Heap Viwer
一起使用逊移,來分析大對(duì)象產(chǎn)生的原因。
六龙填、參考文獻(xiàn)
http://android.xsoftlab.net/tools/performance/comparison.html
更多文章胳泉,歡迎訪問我的 Android 知識(shí)梳理系列:
- Android 知識(shí)梳理目錄:http://www.reibang.com/p/fd82d18994ce
- 個(gè)人主頁:http://lizejun.cn
- 個(gè)人知識(shí)總結(jié)目錄:http://lizejun.cn/categories/