天天看点

Eclipse的MAT的支配树

学习 尚硅谷 宋红康 JVM从入门到精通 的学习笔记

概念

MAT提供了一个称为支配树的对象图.支配树体现了对象实例之间的支配关系(支配关系就是我支配你, 你是我管辖的,你做什么都要先经过我,那么就是我支配你.).在对象的引用图中,所有指向对象B的路径都经过对象A,则认为对象A支配对象B.

如果对象A是离对象B最近的一个支配对象,就认为对象A为对象B的直接支配者.

Eclipse的MAT的支配树

比如说这个H,我要访问H的话,必须要通过C,那么C就是支配者 ,F和G不是,因为你访问H的时候,你可以不经过F,直接去经过G, 你访问H的时候,你也可以不经过G,直接经过F.

支配树是基于对象间的引用图所建立的,有下面的基本性质:

  • 对象A的子树(所有被对象A支配(只有通过对象A才能访问的到)的对象集合)表示对象A的保留集(retained set),即深堆.
  • 如果对象A支配对象B,那么对象A的直接支配者也支配对象B,因为对象A支配对象B,那么说明要想经过对象B,就必须要走对象A的链路,那么如果有对象C是对象A的直接支配者,走链路只走对象A,那么这个对象C也是只走对象B

    *支配树的边与对象引用图的边不直接对应的,

Eclipse的MAT的支配树

上图所示:左边图标识对象引用图,右边图标识左图所对应的支配树.对象A和B由根对象直接支配,由于在到对象C的路径中,可以经过A,也可以经过B,因此对象C的直接支配者也是根对象.对象F与对象D互相引用,因为到对象F的所有路径必然经过对象D,因此,对象D是对象F的直接支配者.而到对象D的所有路径中,必然经过对象C,即使是从对象F到对象D的引用,从根节点触发,也要经过对象C的,所以对象D的直接支配者为对象C.

同理,对象E支配对象G,到达对象Hd可以通过对象D,也可以通过对象E,因此对象D和E都不能支配对象H,而经过对象C既可以到达D也可以到达E,因此对象C为对象H的直接支配者.

注意:

跟随我一起来理解如何从“对象引用图—》支配树”,首先需要理解支配者(如果要到达对象B,毕竟经过对象A,那么对象A就是对象B的支配者,可以想到支配者大于等于1),然后需要理解直接支配者(在支配者中距离对象B最近的对象A就是对象B的直接支配者,你要明白直接支配者不一定就是对象B的上一级,然后直接支配者只有一个),然后还需要理解支配树是怎么画的,其实支配树中的对象与对象之间的关系就是直接支配关系,也就是上一级是下一级的直接支配者,只要按照这样的方式来作图,肯定能从“对象引用图—》支配树”

在Eclipse MAT工具中如何查看支配树:

Eclipse的MAT的支配树