vlambda博客
学习文章列表

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 的更多知识。例如,一个应用程序的源代码如下所示:

 
   
   
 
  1. public class A {

  2. private C c1 = C.getInstance();

  3. }

  4. public class B {

  5. private C c2 = C.getInstance();

  6. }

  7. public class C {

  8. private static C myC = new C();

  9. public static C getInstance() {

  10. return myC;

  11. }

  12. private D d1 = new D();

  13. private E e1 = new E();

  14. }

  15. public class D {

  16. }

  17. public class E {

  18. }

  19. public class SimpleExample {

  20. public static void main (String argsp[]) throws Exception {

  21. A a = new A();

  22. B b = new B();

  23. }

  24. }

现在,如果要为上述示例应用程序以图形方式绘制对象,则其外观将如下所示:图 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

JVM 内存分析神器 MAT: Incoming、Outgoing 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 的报告

JVM 内存分析神器 MAT: Incoming、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、数据库、数据结构等等。

明天见(。・ω・。)ノ♡