1、下载MAT
MAT是使用非常广泛的Java内存分析工具,功能强大;
(1)官网下载:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation
(2)解压后双击运行
2、获取HPROF文件
(1)使用Android Device Monitor获取HPROF文件
cmd输入monitor启动Android Device Monitor;(手机打开开发者选项和USB调试模式,和PC连接)
得到HPROF文件:
使用AndroidSDK自带的hprof-conv转换,转换后的文件才可以用MAT打开:
//hprof-conv 位置在sdk/platform-tools/hprof-conv
hprof-conv xxx.xxx.xxx.hprof xxx.xxx.xxx.hprof
(2)使用AndroidStudio获取HPROF文件
------待补充------
3、MAT打开分析HPROF文件
上图为使用Top Consumers统计的使用情况;
4、MAT在分析Android应用时的常用技巧------去除系统资源类内存的干扰
上图统计结果,系统的资源类占据了很大一部分的内存,而其余的前几名往往也是系统类。这是由于从虚拟机角度不会区分系统框架和应用自身的对象;
(1)为了去除这部分对分析的干扰,在使用AndroidSDK提供的hprof-conv转换时需要增加一个参数:
hprof-conv -z befroe.hprof after.hprof
//说明
hprof-conv [-z] <infile> <outfile>
-z:exclude non-app heaps,such as Zygote
(2)OQL查询--另一种去除系统资源类干扰的方法
JVM 对象查询语言(OQL);
如果hprof文件时经过转换的,可以在数据中寻找应用的Application类对象,将对象地址转换为十进制后输入以下查询语句:
select * from instance of java.lang.object s where s.@objectAddress > 1107296256
使用-z参数转换或OQL查询得到的对象集合就只包含应用代码分配的部分了,在此基础上使用MAT的Top Consumers功能就能得到比较准确的结果,如下图所示:
没有了系统类所占内存的干扰,只有应用自身代码创建的对象,对于发现内存问题比较有帮助。
对于一般的内存泄露类问题,使用以上方法后通过MAT提供的分析报告就很快识别出来。
内存问题常常是加载后忘了释放Bitmap(一直没有销毁而存在于ImageLoader里,使用一段时间后ImageLoader会越来越庞大)、临时生成的byte数组和文件缓冲区、包含Handler的Activity等。