10.6 使用MAT工具分析App内存状态" class="reference-link">10.6 使用MAT工具分析App内存状态
MAT(Memory Analyzer Tool)工具是一个分析内存的强力助手。
10.6.1 生成HPROF文件" class="reference-link">10.6.1 生成HPROF文件
首先打开Android Device Monitor工具,选择要监听的线程,并点击菜单栏中的“Update Heap”按钮,如图10.21所示。
图10.21 Update Heap
在Heap标签中,点击“Cause GC”按钮,就会显示出当前的内存状态,如图10.22所示。
图10.22 Heap状态
这里有一个判断当前是否存在内存泄漏的小技巧:当我们不停地点击“Cause GC”按钮时,如果“data object”一栏中的“Total Size”有明显变化,就代表可能存在内存泄漏。
上面是手动查看Heap状态,下面点击菜单栏的“Dump HPROF File”按钮,如图10.23所示。
图10.23 Dump HPROF File
等待几秒钟后,系统就会生成一个.hprof文件,我们要分析的就是这个文件。将它保存到PC上,默认名为包名. hprof。不过对这个文件我们还不能直接使用MAT工具进行分析,还需要进行格式转换。在命令行下,切换到SDK目录的platform-tools目录下,使用hprof-conv工具帮助我们进行转换,命令如下所示:
- D:\sdk\platform-tools>hprof-conv F:\Heap\com.imooc.heap.hprof heap.hprof
命令格式为“hprof-conf infile outfile”,使用生成的heap.hprof文件就可以利用MAT工具进行内存分析了。
10.6.2 分析HPROF文件" class="reference-link">10.6.2 分析HPROF文件
打开MAT工具,选择“Open a Heap Dump”选项,如图10.24所示。
图10.24 Open a Heap Dump选项
等待文件导入后,显示分析结果如图10.25所示。
图10.25 MAT分析结果
在10.25中的报告里已经对整个内存状态进行了初始的分析,并给出了简要的分析结果。后面还可以进行更深入的分析,MAT功能强大,这里主要看以下几个功能。
- Histogram
Histogram直方图,用于显示内存中每个对象的数量、大小和名称。点击后打开Histogram标签,如图10.26所示。
图10.26 Histogram
在最上方一行,可以通过搜索过滤相应的关键字,这点在分析内存中是非常有用的,比如可以过滤“Game”关键字,查询结果如图10.27所示。
图10.27 搜索关键类
在选择的对象上单击鼠标右键,在弹出的快捷菜单中选择“List objects-with incoming references”选项查看具体的对象。
- Dominator Tree
Dominator Tree支配树会将内存中的对象按照大小进行排序,并显示对象之间的引用结构。点击后打开Dominator Tree标签,显示如图10.28所示。
图10.28 Dominator Tree
对象已经按照“Retained Heap”进行排序了,即按照对象及其所持有的引用的内存总和进行排序。通过分析内存占用大的对象来找出内存消耗的原因。
