概念
MAT提供了一个称为支配树的对象图.支配树体现了对象实例之间的支配关系(支配关系就是我支配你, 你是我管辖的,你做什么都要先经过我,那么就是我支配你.).在对象的引用图中,所有指向对象B的路径都经过对象A,则认为对象A支配对象B.<br /> 如果对象A是离对象B最近的一个支配对象,就认为对象A为对象B的直接支配者.<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/350923/1659248203255-02012d68-8e49-4449-b3b4-8963645bb495.png#clientId=u323f118f-311d-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=380&id=u969aec61&margin=%5Bobject%20Object%5D&name=image.png&originHeight=380&originWidth=179&originalType=binary&ratio=1&rotation=0&showTitle=false&size=44922&status=done&style=none&taskId=u45b07941-c213-4aca-8292-5852ba6a3a1&title=&width=179)<br /> 比如说这个H,我要访问H的话,必须要通过C,那么C就是支配者 ,F和G不是,因为你访问H的时候,你可以不经过F,直接去经过G, 你访问H的时候,你也可以不经过G,直接经过F.<br /> 支配树是基于对象间的引用图所建立的,有下面的基本性质:<br /> * 对象A的子树(所有被对象A支配(只有通过对象A才能访问的到)的对象集合)表示对象A的保留集(retained set),即深堆.<br /> * 如果对象A支配对象B,那么对象A的直接支配者也支配对象B,因为对象A支配对象B,那么说明要想经过对象B,就必须要走对象A的链路,那么如果有对象C是对象A的直接支配者,走链路只走对象A,那么这个对象C也是只走对象B<br /> *支配树的边与对象引用图的边不直接对应的,
上图所示:左边图标识对象引用图,右边图标识左图所对应的支配树.对象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工具中如何查看支配树:
上图中Object数组里面只有8个对象,原因是因为8个对象是这个Student对象自己独有的,如果这个Student对象被垃圾回收了,那么支配树下面的Object数组里面的8个对象也会被垃圾回收掉.