JVM 内存分析神器 MAT: Incoming、Outgoing References 解析
了解 Eclipse MAT 中 incoming and outgoing 引用之间的区别。
Eclipse MAT(内存分析器工具)是分析 JVM 堆 Dump 文件的强大工具。它具有几个非常有效分析内存问题的强大功能。“Incoming references”和“Outgoing references”就是其中一种功能。在本文中,我们来探讨 Incoming references 和 Outgoing references 以及它们之间的区别。在 Eclipse MAT 中,当右键单击任何对象时,将看到下拉菜单。如果选择“ListObjects”菜单项,则会注意到两个选项:
-
with outgoing references -
with incoming references
通过示例理解知识会更容易,咱们来看看这样一个例子。让我们通过示例来了解有关 Incoming references 和 Outgoing references 的更多知识。例如,一个应用程序的源代码如下所示:
public class A {
private C c1 = C.getInstance();
}
public class B {
private C c2 = C.getInstance();
}
public class C {
private static C myC = new C();
public static C getInstance() {
return myC;
}
private D d1 = new D();
private E e1 = new E();
}
public class D {
}
public class E {
}
public class SimpleExample {
public static void main (String argsp[]) throws Exception {
A a = new A();
B b = new B();
}
}
现在,如果要为上述示例应用程序以图形方式绘制对象,则其外观将如下所示:图 1:示例应用程序的对象引用图
-
对象 A 和对象 B 持有对象 C 的引用 -
对象 C 持有对象 D 和对象 E 的引用
在这个示例项目中,让我们具体分析下对象 C 的 Incoming references 和 Outgoing references 。
对象 C 的 Incoming References
拥有对象 C 的引用的所有对象都称为 Incoming references。在此示例中,对象 C 的“Incoming references”是对象 A、对象 B 和 C 的类对象 。
为了证实这个判断,我们从上述示例应用程序中捕获了堆 Dump 文件,并将其载入到 Eclipse MAT 中进行分析。下图是 Eclipse MAT 针对对象 C 报告的 Incoming references
图 2:对象 C 的 Incoming references
在"Dominator Tree"中的 Object C 上单击鼠标右键,然后选择"List Objects",再选择 ”with incoming references“时,Eclipse MAT 会生成上图的报告。报告中展示对象 C 的 Incoming references 为对象 A、对象 B 和 C 的类对象。Eclipse MAT 还显示了用于引用对象 C 的变量,可以看到使用变量“c1”引用对象 C 的对象 A,类似地,还报告了用于引用对象 C 的其他变量。
对象 C 的 Outgoing References
对象 C 引用的所有对象都称为 Outgoing References。在此示例中,对象 C 的“outgoing references”是对象 D、对象 E 和 C 的类对象。以下是 Eclipse MAT 针对对象 C Outgoing references 的报告
图 3:对象 C 的 Outgoing references
在"Dominator Tree"中的 Object C 上单击鼠标右键,然后选择"List Objects",再选择 ”with incoming references“时,Eclipse MAT 会生成上图的报告。报告中展示对象 C 的 Incoming references 为对象 D、对象 E 和 C 的类对象。Eclipse MAT 还按显示对象 C 引用的其他对象。可以看到对象 C 使用变量 d1 引用了对象 D。类似地,报告还显示了对象 C 中使用的其他变量。
通过本文主要阐述了 Incoming references and Outgoing references 之间的区别。
本文翻译,涤生的博客
近期热文
最后,分享一份面试宝典《Java核心知识点整理.pdf》,覆盖了JVM、锁、高并发、反射、Spring原理、微服务、Zookeeper、数据库、数据结构等等。
明天见(。・ω・。)ノ♡