检测内存工具相关概念

一  为什么要了解这些相关概念:

在使用mat或者android studio工具检测内存的时候, 会看到一系列的视图, 这些视图都包含一些列名, 我们必须知道这些列名所代表的含义才能进行分析.

二  涉及的相关概念:

1 .  视图中列名代表的意思:

shallow heap:指的是某一个对象所占内存大小。

retained heap:指的是一个对象的retained set所包含对象所占内存的总大小。

objects:当前对象存在的数量

注: 如果retained heap的值远远大于shallow heap的值, 说明该类型的对象或者该类型中持有的对象有可能有异常

2 .Dorminator Tree(支配树)的详细解释:

Dorminator Tree(支配树): 支配树可以直观地反映一个对象的retained heap, 对应mat中的支配树视图.

retained set:指的是这个对象本身和他持有引用的对象和这些对象的retained set所占内存大小的总和,用官方的一张图来解释如下:

虽然说MAT定义的支配树和上图中的引用树稍有不同,但是二者的本质都可以反映一个对象如果被回收,有多少内存可以同时得到释放,只不过支配树的定 义下可 以更精确地反映这个数量。简单来说把支配树简单想象成引用树即可。

实 际上支配树就是从引用树演化而来。所谓支配,例如x对象支配y对象,就是在引用树当中,一条到y的路径必然会经过x;所谓直接支配,例如x直接支配y, 指的是在所有支配y的对象中,x是y最近的一个对象。支配树就是反映的这种直接支配关系,在支配树种,父节点必然是子节点的直接支配对象,下图就是一个从 引用树到支配树的转换示意图:

上 面这幅图右边就是从左边转换而来形成的支配树,这里特别对C节点形成的子树做一下说明。CDE及DF、EG的关系就不用多说,从引用树和我们刚才 对支配 概念的阐述可以直接得出结论,关键是H节点,H节点在支配树种既不是D的子节点也不是E的子节点是因为,在引用树当中,能够到达H的路径有两条,DEFG 节点都不是到达它的路径上必须经过的节点,符合这个条件的只有C节点,因此在支配树中H是C的子节点。现在仔细观察支配树可以发现,一个节点的子树正好就 是这个节点对应的retained set。比如,如果D节点被回收,那么就可以释放DF对象所占的内存,但是H所占的内存还不能得到释放,因为可能G还在引用着H,这也是为什么在支配树中 H是C节点的子节点的原因,只有C节点被回收了才一定能够回收H节点所占的内存。

MAT中Dorminator Tree主要可以用于诊断一个对象所占内存为什么会不断膨胀,一个对象膨胀,就说明它对应到支配树中的子树就越来越庞 大,只要分析这个对象对应的子树,确定那些对象是不应该出现在子树中就可以对问题手到病除。

你可能感兴趣的:(检测内存工具相关概念)