Android Studio 3.0 Memory Profiler使用

Memory Profiler是Android Profiler中的一個組件芜果,Android Profiler是Android Studio3.0用來替換之前Android Monitor的觀察工具豆胸,主要用來觀察內(nèi)存偎快,網(wǎng)絡(luò),cpu溫度辆琅。今天著重介紹其中的Memory Profiler笙什。它能夠讓你識別出來內(nèi)存泄漏和內(nèi)存抖動即供,導(dǎo)致應(yīng)用卡頓吨悍,anr和crash. 它可以給你展示一個內(nèi)存使用的真實圖表扫茅,讓你知道當時內(nèi)存使用情況,還能強制內(nèi)存回收育瓜,和跟蹤內(nèi)存分配.

如何打開Memory Profiler葫隙?

image.png

最后進入Memory Profiler


image.png

為什么要去觀察應(yīng)用內(nèi)存的使用情況?

剛才也提到了Memory Profiler是用來解決內(nèi)存分配中產(chǎn)生抖動躏仇,導(dǎo)致應(yīng)用卡頓恋脚,anr和crash問題. 在Android系統(tǒng)內(nèi)存管理上,它是提供一套內(nèi)存回收機制去回收無用的對象钙态,其實就是Dalvik虛擬機的垃圾回收器,當垃圾回收器啟動回收機制的時候菇晃,其實會對應(yīng)用的運行產(chǎn)生一點影響册倒,但是這種影響來說一般微乎其微,察覺不到磺送。但是如果你的內(nèi)存分配比垃圾回收快很多驻子,這種情況可能導(dǎo)致垃圾回收器回收內(nèi)存不及時,從而導(dǎo)致應(yīng)用出現(xiàn)卡頓的現(xiàn)象.(這其實就是內(nèi)存抖動所產(chǎn)生的影響). 另外一個問題就是內(nèi)存泄漏估灿,內(nèi)存的持續(xù)泄漏可能導(dǎo)致內(nèi)存溢出崇呵,從而app運行出現(xiàn)outofmem異常。
Memory Profiler通過以下方面防治上面出現(xiàn)的問題:
1馅袁,觀察不必要的內(nèi)存分配域慷。(這種內(nèi)存分配導(dǎo)致效率降低)
2,Dump the Java heap 去觀察指定時間對象的在內(nèi)存中的分配情況,若干次Dump能夠幫助你發(fā)現(xiàn)內(nèi)存泄漏
3犹褒,測試極端的用戶交互情況下的內(nèi)存分配(比如說狂點某個請求按鈕)抵窒,看看內(nèi)存使用情況如何,是否出現(xiàn)內(nèi)存抖動.

Memory Profiler主面板介紹

image.png

1:強制內(nèi)存回收按鈕
2:Dump the Java heap
3:開始/停止記錄內(nèi)存分配情況
4:縮械铩/放大時間線
5,實時播放內(nèi)存分配情況(這個按鈕點下試試便清楚了)
6,發(fā)生一些事件的記錄(如Activity的跳轉(zhuǎn)李皇,事件的輸入,屏幕的旋轉(zhuǎn))
7,內(nèi)存使用時間線
包含多少內(nèi)存被使用(左邊的y軸)宙枷,還有頂上的顏色標記內(nèi)存的類型掉房,右邊的y軸表明分配對象的個數(shù),另外出現(xiàn)垃圾回收事件會有一個小圖標.

關(guān)于頂部的幾種內(nèi)存類型介紹:
Java : java代碼分配的內(nèi)存
Native:c/c++代碼分配的內(nèi)存(有時候其實并沒有使用到c/c++代碼,但還是會有Native的內(nèi)存分配,因為Android Framework會去通過java代碼訪問一些需要使用Native的資源慰丛,如圖像資源Bitmap)
Graphics:圖像緩存等卓囚,包括GL surfaces, GL textures等.
Stack:棧內(nèi)存(包括java和c/c++)
Code:代碼的內(nèi)存分配(例如代碼,資源璧帝,libs等等)
Other:這個是連系統(tǒng)都不知道是什么類型的內(nèi)存捍岳,放在這里.
Allocated: jave分配的對象個數(shù) (在Android7.1和以下的設(shè)備,這個計數(shù)是在設(shè)備連接后開始睬隶,所以并不是app啟動時候的計數(shù)锣夹。Android8.0或更高,在系統(tǒng)里面內(nèi)置的Profiler工具苏潜,所以無論什么時候連接银萍,都是app啟動時候的計數(shù))

如何觀察對象分配的情況?

我們需要關(guān)注如下信息:
1,什么類型對象被分配恤左,分配了多大的空間
2,對象分配的棧調(diào)用贴唇,是在哪個線程中調(diào)用的
3,對象的釋放時間(只針對8.0+)
如果是8.0以上的設(shè)備,不需要點擊之前面板介紹中的按鈕3飞袋,就可以觀察某一段時間的內(nèi)存分配情況戳气,如果是7.1或以下是需要點擊按鈕3開始和停止。
Android8.0觀察一段時間的內(nèi)存分配情況:


demo2.gif

Android7.1或以下觀察一段時間的內(nèi)存分配情況:
demo3.gif

在7.1以下設(shè)備和8.0在記錄對象個數(shù)上面也是有區(qū)別的巧鸭,前者記錄是最大65535個最近使用的對象瓶您,8.0卻沒有這個限制.

當分析結(jié)束后會彈出如下面板:

image.png

下面是重頭戲,查看對象分配情況纲仍,也就是我們前面提到需要關(guān)注什么類型對象被分配呀袱,分配了多大的空間。
1,在Class Name列看一下有沒有異常分配的對象郑叠,個數(shù)很多夜赵,占用內(nèi)存比較大。點擊頭部Class Name進行一個按字母排序操作乡革,點擊Class Name面板下面的類名可以看到Instance View面板詳細的對象信息.
2,點擊Instance View面板中的對象寇僧,可以看到調(diào)用棧信息和調(diào)用的線程.
3,在Call Stack中點擊可以跳轉(zhuǎn)到實際的代碼.
以上是捕獲一段時間的內(nèi)存分配情況摊腋,如果想捕獲一瞬間的內(nèi)存分配需要用到heap dump.

捕獲一個heap dump

捕獲一個heap dump觀察某一個時間點的對象分配情況,注意之前介紹是一個時間段婉宰,而這里是時間點歌豺。它有助于幫助我們分析內(nèi)存泄漏,比如當我應(yīng)用使用一段時候后心包,捕獲了一個heap dump类咧,這個heap dump里面發(fā)現(xiàn)了并不應(yīng)該存在的對象分配情況,這說明是存在內(nèi)存泄漏的蟹腾。通過一個heap dump你可以看到以下內(nèi)容:
1痕惋,你的app分配了什么樣的對象類型,每個類型分配了多少個數(shù)和大小娃殖。
2值戳,使用了多少內(nèi)存
3,每個對象在代碼中的使用位置
4炉爆,對象分配的調(diào)用棧情況

捕獲一個heap dump在工具欄中點擊之前面板介紹中的按鈕2堕虹,稍等一會兒便能夠看到類似于之前記錄內(nèi)存分配后的面板彈出。

image.png

在上面圖片中可以看到如下列:
Class Name : 這個很好理解芬首,就是類名
Alloc Count : 對象個數(shù)
Native Size : c/c++層內(nèi)存大小(bytes)
Shallow Size : java層內(nèi)存大小(bytes)
Retained Size : 這個是這個類中所引用到的對象的總大小 * 該類對象的個數(shù)

當點擊app heap下拉列表會出現(xiàn)3個選項
Default heap: 這個我也不太明白是什么意思
App heap: app中的堆分配
Image heap: 圖像的堆分配
Zygote heap: 這個按照官方的解釋是來自安卓系統(tǒng)fork進程的地方產(chǎn)生的寫數(shù)據(jù)備份
當點擊Arrange by class下拉列表會出現(xiàn)3個選項
Arrange by class:根據(jù)類名進行分組
Arrange by package:根據(jù)包名進行分組
Arrange by callstack:根據(jù)調(diào)用棧進行分配(這個目前也不是太理解)

當我們點擊其中一個類的時候會彈出一個新的Instance View面板,如下圖:


image.png

每列中包括以下:
Depth: GC root到達該實例的最短跳數(shù).
Native Size: c/c++層中內(nèi)存的大小(bytes)
Shallow Size:java層內(nèi)存大小(bytes)
Retained Size:這個類中所引用到的對象的總大小(bytes)
另外補充一下赴捞,heap dump是看不到調(diào)用棧信息的.也就是上圖中的Call Stack面板.

分析你的heap,按照一下步驟.
1,瀏覽Class Name列表,看看有沒有大量對象存在,并且這些對象你認為是不應(yīng)該存在的郁稍,可能存在內(nèi)存泄漏的情況. 點擊類名可以看到詳細的對象信息.

2,在這個Instance View面板中赦政,點擊一個實例References面板就會顯示出來,里面都是使用該Instance的Reference耀怜,點擊剪頭可以看到引用它的所有區(qū)域恢着。點擊鼠標右鍵可以選擇go to instance去看到引用該引用的引用,或者jump to source去看調(diào)用的源代碼.

另外heap dump也是可以保存成為HPROF文件的,點擊如下按鈕即可保存起來财破,用于以后分析掰派,或用作其它工具分析.


image.png

一般出現(xiàn)內(nèi)存泄漏的原因有:
1,長期引用到Activity,Context,View,Drawable的對象左痢。
2靡羡,非靜態(tài)的內(nèi)部類,例如Runnable它可以引用到Activity的實例
3抖锥,一些長期緩存對象

下面舉一個例子具體分析一下如何使用Memory Profiler查找內(nèi)存泄漏.

查找內(nèi)存泄漏有以下幾個方式
1,一般我排查內(nèi)存泄漏的方式是亿眠,啟動應(yīng)用碎罚,看一下當前內(nèi)存使用了多少磅废,使用應(yīng)用一段時間后(當然你不想親自動手點來點去,也可以使用monkey進行一次自動化測試), 退回到應(yīng)用首頁荆烈,看看當前內(nèi)存又是多少拯勉。進行一次heap dump, 看看結(jié)果竟趾,分析一下有沒有可疑的對象分配(比如說大量重復(fù)的Activity,同一個類型對象比較多宫峦,對象內(nèi)存占用較大).
2,發(fā)現(xiàn)可疑點后岔帽,通過分析結(jié)果,可以找到相應(yīng)代碼导绷,找到代碼當然也能找到使用代碼的場景犀勒,例如是Activity泄漏,反復(fù)進行畫面的跳轉(zhuǎn)(如果你的應(yīng)用支持橫豎平切換的話妥曲,也可以反復(fù)旋轉(zhuǎn)屏幕)贾费,然后強制gc回收,看看內(nèi)存是否存在只增不減的情況.
3,也可以使用allocation跟蹤一段時間內(nèi)存分配情況檐盟,拿出來做分析
4,最后推薦一款leakcanary工具使用(具體可看:https://github.com/square/leakcanary
當然如果時間允許的話褂萧,以上每個步驟都需要進行詳細測試。

下面開始正式的栗子:
我啟動了一個疑似存在內(nèi)存泄漏app,然后使用了一段時間葵萎,進行了一次heap dump, 結(jié)果如下


image.png

很明顯我發(fā)現(xiàn)了一個可疑的類OutOfMemActivity, 它存在多個實例导犹,實際上在已知該app業(yè)務(wù)邏輯中是不應(yīng)該會有這么多OutOfMemActivity實例的,于是我變點開它的Instance View.
可疑點如紅色剪頭所指羡忘,因為外部類實例引用到Activity都是不正常的操作谎痢,這里Broadcast的實例引用到了Activity.


image.png

點擊跳轉(zhuǎn)到源碼,發(fā)現(xiàn)是內(nèi)部類引用到外部類實例(Activity)的情況導(dǎo)致了內(nèi)存泄漏.
image.png

其實引起內(nèi)存泄漏的情況還有很多壳坪,這里就不一一列舉舶得,上面只是展示一下Memory Profiler這個工具的使用.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爽蝴,隨后出現(xiàn)的幾起案子沐批,更是在濱河造成了極大的恐慌,老刑警劉巖蝎亚,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件九孩,死亡現(xiàn)場離奇詭異,居然都是意外死亡发框,警方通過查閱死者的電腦和手機躺彬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梅惯,“玉大人宪拥,你說我怎么就攤上這事∠臣酰” “怎么了她君?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長葫哗。 經(jīng)常有香客問我缔刹,道長球涛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任校镐,我火速辦了婚禮亿扁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸟廓。我一直安慰自己从祝,他們只是感情好,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布引谜。 她就那樣靜靜地躺著哄褒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪煌张。 梳的紋絲不亂的頭發(fā)上呐赡,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音骏融,去河邊找鬼链嘀。 笑死,一個胖子當著我的面吹牛档玻,可吹牛的內(nèi)容都是我干的怀泊。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼误趴,長吁一口氣:“原來是場噩夢啊……” “哼霹琼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凉当,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤枣申,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后看杭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忠藤,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年楼雹,在試婚紗的時候發(fā)現(xiàn)自己被綠了模孩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡贮缅,死狀恐怖榨咐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谴供,我是刑警寧澤块茁,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站憔鬼,受9級特大地震影響龟劲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜轴或,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一昌跌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧照雁,春花似錦蚕愤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至污呼,卻和暖如春裕坊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背燕酷。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工籍凝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苗缩。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓饵蒂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酱讶。 傳聞我的和親對象是個殘疾皇子退盯,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

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