Android---App内存优化-之-全面理解MAT

169 阅读3分钟

本文以上一篇博客 《Android | App内存优化 之 内存泄漏 要点概述 以及 解决实战》获得的堆转储文件为例, 介绍一下MAT工具

  • MAT工具上侧有一系列的可选项, 现在看一下第一项,OverView, 也就是一个概览信息, 第一行是大小、Class对象、Object的数量、类加载器等等, 行末的Unreachable Objects Histogram可以点击查看可被回收的 但是仍然在内存当中 没被回收的对象




  • 第二个图标按钮是Histogram单词直方图的意思), 该视图可以列出来, 某一个具体的Class它到底有多少实例,一个某一类型实例它的个数,及其 Shallow Heap,堆中 此类型所有实例 自身的总大小(以字节为单位), Retained Heap,为 此类型的所有实例 而 保留的内存总大小(以字节为单位), (在引用链上,此类型的所有实例占用的内存);同时我们可以在这个视图中(视图第一行),检索具体的某一个类的信息, 从而来判断该对象有没有存在内存泄漏的可能, 比如我们在上一篇博客《Android | App内存优化 之 内存泄漏 要点概述 以及 解决实战》, 检索的就是MemoryLeakActivity
    接着, 在下图中,该图标的下拉菜单中, 还有一个Group by package的菜单项: 也就是可以让视图中的实例,以包名的形式来进行摆放:默认是以类的形式进行摆放的, 即Group by Class; 通过Group by package视图查看形式, 我们可以很容易地找到MemoryLeakActivity接下来,点击某一个实例,右键, 选择List objects -> with incoming references, 我们在排查内存泄漏的过程中, 应该选择with incoming reference进行分析才行,!!!!! 查看 本(我们这个) 类型实例 被 谁/哪些类型实例 所引用,!!!!! 导致我们这个类型实例自身不能被回收,!!!!! 【!!!! 因为之所以内存泄漏, 就是某些没用的实例没有被及时正确回收, 而某个实例被别人引用了,也就回收不了了; !!!!】 (List objects下有两个菜单项, with incoming reference incoming 指过来 即指的是 引用到该选中实例的实例, 即查看 本 类型实例 被 谁/哪些类型实例 所引用
    with outcoming references outcoming 指出去 被该选中实例引用的实例, 即查看本 类型实例 引用了 谁/哪些类型实例;)



  • 第三个按钮,Dominator Tree(Dominator n.支配者,支配力,统治者;) 视图展示 每一个类型对象的 支配树(注意是每一个对象!!):关注百分比比较大的对象; 观察其能不能被回收, 以及为什么不能被回收;这里注意Percentage这个栏目, 显示的值 即该类型对象总共占了所有对象的百分之几; 比如说我们还是检索一下MemoryLeakActivity(注意这个视图也能够检索!!) 这里也能够,右键, 选择List objects选项: !!!! Histogram是基于 类型 分析,只分析类型, 不具体到某个实例, Dominator Tree是基于 实例 分析, 具体到 某个实例; !!!!




第四个按钮是OQL,即 对象查询语言 , Object Query Language, 可以像检索数据库一样 检索 对象:




第五个按钮,Thread OverView, 可以查看堆转储文件记录时,有多少线程在执行, 及其线程相关的信息




##Top Consumers 和 Leak Suspect Top Consumers 列出来那么占用内存比较高的对象; Biggest Objects可以查看相关的更详细的信息;Leak Suspect则, 提供了两个Problem Suspect 自动化分析,配置有Detail按钮可以查看, 供我们参考;






#####参考自