性能優(yōu)化工具知識(shí)梳理(6) - Memory Monitor & Heap Viewer & Allocation Tracker

性能優(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 MonitorAndroid 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í)梳理系列:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市岩遗,隨后出現(xiàn)的幾起案子扇商,更是在濱河造成了極大的恐慌,老刑警劉巖宿礁,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件案铺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡梆靖,警方通過查閱死者的電腦和手機(jī)控汉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來返吻,“玉大人姑子,你說我怎么就攤上這事〔饨” “怎么了街佑?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我沐旨,道長(zhǎng)森逮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任磁携,我火速辦了婚禮吊宋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颜武。我一直安慰自己,他們只是感情好拖吼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布鳞上。 她就那樣靜靜地躺著,像睡著了一般吊档。 火紅的嫁衣襯著肌膚如雪篙议。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天怠硼,我揣著相機(jī)與錄音鬼贱,去河邊找鬼。 笑死香璃,一個(gè)胖子當(dāng)著我的面吹牛这难,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播葡秒,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼姻乓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了眯牧?” 一聲冷哼從身側(cè)響起蹋岩,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎学少,沒想到半個(gè)月后剪个,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡版确,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年扣囊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阀坏。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡如暖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忌堂,到底是詐尸還是另有隱情盒至,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站枷遂,受9級(jí)特大地震影響樱衷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酒唉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一矩桂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痪伦,春花似錦侄榴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辉哥,卻和暖如春桦山,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背醋旦。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工恒水, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饲齐。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓钉凌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親捂人。 傳聞我的和親對(duì)象是個(gè)殘疾皇子甩骏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容