专栏首页涤生的博客JVM 内存分析神器 MAT: Incoming Vs Outgoing References 你真的了解吗?

JVM 内存分析神器 MAT: Incoming Vs 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 之间的区别。

原文:https://dzone.com/articles/eclipse-mat-incoming-outgoing-references

本文分享自微信公众号 - 涤生的博客(disheng_yq),作者:Ram Lakshmanan

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据库中间件那些事儿

    互联网当下的数据库拆分过程基本遵循的顺序是:垂直拆分、读写分离、分库分表(水平拆分)。每个拆分过程都能解决业务上的一些问题,但同时也面临了一些挑...

    涤生
  • Zookeeper 集群如何高可用部署?

    Zookeeper 我想大家都不陌生,在很多场合都听到它的名字。它是 Apache 的一个顶级项目,为分布式应用提供一致性高性能协调服务。可以用来做:配置维护、...

    涤生
  • System.gc() 源码解读

    System.gc(),大家应该也有所了解,是JDK提供的触发Full GC的一种方式,会触发Full GC,其间会stop the world,对业务影响较大...

    涤生
  • 2018年云HR市场及用户实践研究报告(预告篇)

    人称T客
  • T研究:平均20-60万,BPM入列高投入云应用阵营

    在上篇《T研究:国内云BPM市场规模尚小,预计2018年仅为3.29亿元》的解读中,T媒体发现,虽然国内云BPM整体市场规模较小,但其企业用户市场的流失率仅为3...

    人称T客
  • 【leetcode刷题】T139-在每个树行中找最大值

    https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row/

    木又AI帮
  • Linux命令(44)——expand命令

    用于将文件的制表符(Tab)转换为空格符(Space),默认一个Tab对应8个空格符,并将结果输出到标准输出。若不指定任何文件名或所给文件名为”-“,则expa...

    Dabelv
  • 什么是光伏监控系统?

    光伏电站监控系统可实现集中监控所有光伏电站的电力一次、二次系统、直流系统、逆变系统、环境监测系统、发电量信息等。同时根据具体要求,可以实现远程光伏电站视频系统对...

    齿轮易创说互联网
  • 带有Apache Spark的Lambda架构

    市场上的许多玩家已经建立了成功的MapReduce工作流程来每天处理以TB计的历史数据。但是谁愿意等待24小时才能获得最新的分析结果?这篇博文将向您介绍旨在利用...

    大数据弄潮儿
  • Log4j 2.0在开发中的高级使用详解—默认级别(二)

    Log4j 经过几年的发展之后,终于迎来了它的姊妹版本Log4j 2.0 。在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apach...

    业余草

扫码关注云+社区

领取腾讯云代金券