Android性能優(yōu)化—內(nèi)存泄漏分析之DDMS和MAT(二)

??之前,我們一直都在使用Android Device Monitor對我們的應(yīng)用進行各種分析悬包,也建立了很深厚的感情衙猪,而如今,Android Device Monitor 已在 Android Studio 3.1 中棄用布近,并已從 Android Studio 3.2 中移除垫释,也意味著它即將要退役,離我們越來越遠了撑瞧,為了紀(jì)念這位曾經(jīng)對App做出巨大貢獻的應(yīng)用棵譬,讓我們回顧一下它的事跡!

準(zhǔn)備工作

Android Device Monitor

打開后它的主頁面如圖一预伺,如果有些窗格沒有展示出來订咸,可以點擊window-Reset Perspective-Yes重置下配置,或者點擊window-Show View選擇自己想要展示的窗格


圖一.png
Devices

??設(shè)備列表如圖二所示酬诀,選擇某應(yīng)用后脏嚷,紅色框內(nèi)的圖標(biāo)就會點亮,供您使用瞒御,他們的具體信息從左到右介紹如下:

  • Debug Process:調(diào)試進程父叙,該按鈕一直處于灰色狀態(tài)不能點擊
  • Update Heap:更新堆信息,點擊后它葵腹,結(jié)果將會在Heap窗格中展示
  • Dump HPROF file:獲取hprof文件(常用)高每,官方推薦使用新工具CPU Profiler
  • Cause GC:垃圾回收
  • Update Threads:更新線程信息,結(jié)果在Threads中展示
  • Start Method Profiling:啟動方法分析践宴,官方推薦使用新工具CPU Profiler
  • Stop Process:停止進程
  • Screen Capture:屏幕截圖
  • Dump View Hierarchy for UI Automator:視圖層級轉(zhuǎn)儲(常用)鲸匿,官方推薦使用新工具Layout Inspector,用Layout Inspector查看視圖層級時阻肩,如果您的設(shè)備沒有安裝Google Play商店且已獲得root權(quán)限才能看到正在運行的應(yīng)用带欢,否則,只能看到正在運行的可調(diào)試應(yīng)用烤惊。如果您想在非root手機上查看正在運行的不可調(diào)試應(yīng)用視圖乔煞,建議您使用Dump View Hierarchy for UI Automator嘗試一下
  • Capture System Wide Trace:捕獲系統(tǒng)信息
  • Reset adb:重置安卓調(diào)試橋
  • Start OpenGL Trace:開啟OpenGL跟蹤


    圖二.png

Dump HPROF file

??此功能主要用來生成.hprof文件,對于該文件的分析柒室,還需要工具Eclipse Memory Analyzer打開才行渡贾。monitor生成的.hprof文件并不是標(biāo)準(zhǔn)的、MAT可識別的文件雄右,因此空骚,需要我們把.hprof轉(zhuǎn)成標(biāo)準(zhǔn)的文件后纺讲,才能使用MAT工具進行分析,轉(zhuǎn)換步驟如下:

  • 打開命令行工具
  • 輸入hprof-conv -z A.hprof B.hprof囤屹,如果提示命令hprof-conv用不了的話熬甚,請切換到android sdk/platform-tools后再操作
  • A.hprof為轉(zhuǎn)換前的文件
  • B.hprof為轉(zhuǎn)換后的文件
    ??在這里,我們創(chuàng)建一個項目肋坚,故意讓一個單例類SingleInstance持有SingleInstanceActivity對象導(dǎo)致內(nèi)存泄漏乡括,接著使用DDMS工具生成.hprof文件,然后再使用上面的命令換成標(biāo)準(zhǔn)的.hprof文件后智厌,我們就可以進入MAT的世界了诲泌!
    該測試項目只有三個Java文件如下
    MainActivity.java
public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void onSingleInstance(View view) {
        Intent intent = new Intent(this, SingleInstanceActivity.class);
        startActivity(intent);
    }
}

SingleInstance.java

public class SingleInstance {
    private static Context context;
    private static SingleInstance singleInstance;
    private SingleInstance() {
   }
    public static SingleInstance getInstance(Context ctx) {
        if (singleInstance == null) {
            context = ctx;
            singleInstance = new SingleInstance();
        }
        return singleInstance;
    }
}

SingleInstanceActivity.java

public class SingleInstanceActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_single_instance);
        SingleInstance.getInstance(this);
    }
}

??運行App后,先點擊Dump HPROF file一次獲取沒有產(chǎn)生內(nèi)存泄漏的unml.hprof文件峦剔,接著依序打開SingleInstanceActivity-點擊返回鍵档礁,在DDMS中頻繁點擊GC角钩,再繼續(xù)獲取有內(nèi)存溢出的ml.hprof文件吝沫,然后將unml.hprof轉(zhuǎn)換成unml_stantard.hprof文件,將ml.hprof轉(zhuǎn)換成ml_stantard.hprof文件递礼。

MAT

??使用MAT打開我們剛才生成的unml_stantard.hprof文件惨险,打開步驟:File->Open Heap Demp,打開后默認展示如圖三所示脊髓,這個時候我們點擊Histogram如圖四所示辫愉,然后在紅框這個地方輸入我們的包名敲回車如圖五所示,紅框這個地方顯示将硝,只存在一個實例恭朗,也就是MainActivity句各,同樣的操作牡拇,我們在ml_stantard.hprof看一下弛矛,ml_stantard的Histogram如圖六所示羔味,這個時候我們發(fā)現(xiàn)SingleInstanceActivity還存在呢排作,內(nèi)存泄漏也就產(chǎn)生了备恤,無論我們GC多少次蚓耽,由于該對象被單例對象持有栅葡,而單例對象生命周期和應(yīng)用一致误辑,所以導(dǎo)致SingleInstanceActivity不能回收沧踏。


圖三.png

圖四.png

圖五.png

圖六.png

最后,我們簡單總結(jié)一下整個操作流程如下:

  • 啟動應(yīng)用
  • 打開monitor巾钉,選擇應(yīng)用
  • 點擊Dump HPROF file生成.hprof文件
  • 打開懷疑內(nèi)存泄漏的頁面后翘狱,關(guān)閉,頻繁GC操作
  • 再次生成.hprof文件
  • 將兩個.hprof文件轉(zhuǎn)換成標(biāo)準(zhǔn)的文件
  • 使用MAT工具打開.hprof文件
    ??其實砰苍,整個操作流程還是挺麻煩的潦匈,讀者朋友們了解一下就可以了踏烙,因為Google還提供了另一種更加便利的方式,想了解的朋友可以看一下上一篇文章Android性能優(yōu)化—內(nèi)存泄漏分析(一)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末历等,一起剝皮案震驚了整個濱河市讨惩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寒屯,老刑警劉巖荐捻,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寡夹,居然都是意外死亡处面,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門菩掏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魂角,“玉大人,你說我怎么就攤上這事智绸∫熬荆” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵瞧栗,是天一觀的道長斯稳。 經(jīng)常有香客問我,道長迹恐,這世上最難降的妖魔是什么挣惰? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮殴边,結(jié)果婚禮上憎茂,老公的妹妹穿的比我還像新娘。我一直安慰自己锤岸,他們只是感情好竖幔,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著能耻,像睡著了一般赏枚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晓猛,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天饿幅,我揣著相機與錄音,去河邊找鬼戒职。 笑死栗恩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的洪燥。 我是一名探鬼主播磕秤,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼乳乌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了市咆?” 一聲冷哼從身側(cè)響起汉操,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒙兰,沒想到半個月后磷瘤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡搜变,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年采缚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挠他。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡扳抽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出殖侵,到底是詐尸還是另有隱情贸呢,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布愉耙,位于F島的核電站贮尉,受9級特大地震影響拌滋,放射性物質(zhì)發(fā)生泄漏朴沿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一败砂、第九天 我趴在偏房一處隱蔽的房頂上張望赌渣。 院中可真熱鬧,春花似錦昌犹、人聲如沸坚芜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸿竖。三九已至,卻和暖如春铸敏,著一層夾襖步出監(jiān)牢的瞬間缚忧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工杈笔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闪水,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓蒙具,卻偏偏與公主長得像球榆,于是被迫代替她去往敵國和親朽肥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

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