這篇文章介紹三個內存分析工具
- DDMS,DDMS是ADT安卓開發者工具插件的一部分,可以在Eclipse 或者 Android Studio中安裝使用。它的功能比較豐富,這篇文章裏,我們用DDMS來觀察heap的內存分配情況。
- MAT, 一個專用的內存分析工具,可以分析類和對象的內存佔用,生成各類圖表,給出內存泄漏檢測報告。
- ADB命令,ADBAndroid Debug Bridge,簡單的說它是安卓提供的一個工具可以建立手機到電腦的連接,可以執行一些指令比如安裝刪除程序,發送短信,觀察設備內存,管理安卓設備等。
一、Android Device Monitor+DDMS
把手機連上電腦,打開開發者模式-USB調試,在Android Studio中打開下圖ADM圖標,可以看到DDMS界面
點開左邊的設備列表,可以看到APP的進程,如果看不到進程可能是因爲下面幾個問題
- Android:debuggable="true" APP需要設爲debug模式
- 打開開發者模式
- 不要安裝手機助手類軟件
- 不要同時開啓兩個連接手機的軟件
1.查看線程
選擇Threads標籤,如圖提示Thread updates no enabled,需要點擊下圖左邊Update Thread圖標
2.查看Heap狀態
提示Heap update沒有啓用,點擊下圖左邊Update Heap按鈕,再點擊右邊Cause GC,就可以看到堆內存的數據,點擊Update Heap按鈕旁邊的Dump HPROF file,可以生成HPROF文件,用MAT分析。
這個界面中可以關注Heap Allocated(程序已經分配內存)值,以及Type爲data object 的Total Size,這兩個值能較好的指示出內存是否泄漏,多次進行重複操作後,data object 的Total Size一直增大,GC後沒有明顯回落,就說明有內存泄漏的可能。
二、MAT(Memory Analyzer Tool)
在官網下載MAT,地址 https://www.eclipse.org/mat/
因爲MAT是分析JAVA內存的工具,所以需要用安卓SDK中的工具轉換一下HPROF文件格式,如圖從CMD命令行進入SDK安裝目錄/ platform-tools目錄,使用hprof-conv命令轉換格式。
此時點開TOP Consumers 會發現系統進程佔了大部分內存,如果需要進一步分析安卓的內存消耗,一個是使用OQL語句,例如
select * from instanceof android.app.Activity
大部分內存泄漏發生在activity中,這樣能查詢出所有activity的內存情況。
另外一個方法是之前用SDK的hprof轉換時增加 -z 參數,例如
hprof- conv [-z] < infile>< outfile> -z: exclude non- app heaps, such as Zygote
可以去掉系統類的干擾。(這個方法摘抄自移動APP性能測評與優化書中,但是實際使用時發現很多對象看不懂)