本文以上一篇博客 《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按钮
**可以查看,
供我们参考;
参考自
- 慕课网