这篇文章介绍三个内存分析工具
- 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性能测评与优化书中,但是实际使用时发现很多对象看不懂)