【问题标题】:Where do references to Java Objects really exist?对 Java 对象的引用真正存在于哪里?
【发布时间】:2020-01-02 09:38:24
【问题描述】:

对 Java 对象的引用实际存在于何处? (比如垃圾回收)

在垃圾回收期间不会回收强引用。 hprof 文件似乎记录了对象之间的连接。 它们存在于 JVM 中的什么位置?我猜也有维护它的代码?和对象头有关系吗?

void setView(View view) {
    // This is a “reference” to the view
    this.view = view;
}

问题:

  1. 实际引用存在于哪里?
  2. 如果不是,hprof文件是从哪里来的?

【问题讨论】:

  • 在栈上作为变量,或者在堆里面的对象作为数据成员。您示例中的两个 view 变量都是引用。

标签: java android jvm hprof


【解决方案1】:

对 Java 对象的引用实际存在于哪里?

在内存中。要么在堆中,要么在线程堆栈上,或者(在某些情况下)在 JVM 知道的其他位置。永远在记忆中。

在垃圾回收期间不会回收强引用。

呃……不知道你在说什么。 GC 不会回收引用,因为它们总是作为其他东西的一部分。

hprof 文件似乎记录了对象之间的连接。

确实如此。

它们存在于 JVM 中的什么位置。

连接是参考。如果对象a 在其实例变量之一中引用了对象b,则a 将在hprof 文件中显示为“已连接”到b

但请注意,hprof 文件是一个文件。它不是记忆。它是由 JVM 检查其所有活动内存位置并生成对象的快照而生成的。

我猜也有维护它的代码?

有创建 hprof 文件的代码。它是 JVM 的一部分。

和对象头有关系吗?

好吧。生成 hprof 文件的代码理解对象头。

实际引用在哪里?

在内存中;见上文。

如果不是,hprof文件是从哪里来的?

hprof 文件由 JVM 或与 JVM 对话的工具编写。 (我不是 100% 确定哪个,但这并不重要。)

【讨论】:

    【解决方案2】:

    对Java对象的引用实际存在于哪里?

    像所有其他程序一样,变量或对象驻留在内存中。程序或函数在执行之前与函数参数和其他变量一起加载到内存中。静态变量和函数参数存储在内存布局的堆栈中,而动态内存分配在程序堆栈布局的堆段中完成。如果您对程序堆栈布局/框架感到困惑,我建议您查看this answer here

    hprof 文件似乎记录了对象之间的连接。它们存在于 JVM 中的什么位置?

    我不确定这个。据我所知,它在程序执行者要求时从堆中创建转储。这只是一个具有堆转储的文件。在 Android 的情况下,这应该在您运行分析器并添加特定指令来为您创建堆转储时创建。但是,我不确定这一点。这是an old video,它可能会让您了解如何生成hprof 文件。 The developer's documentation 还告诉您如何创建堆转储。

    【讨论】:

    • 对象之间的“连接”是引用。它们存在于记忆中。
    • 堆转储与JVM无关?原谅?
    • 我知道那是错误的。恕我直言,据我了解,堆转储存储在与程序内存无关的文件系统中。如果我错了,请纠正我。
    • @user207421 当然,存在关系,并且回答者已经删除了该误导性陈述。
    猜你喜欢
    • 2019-08-02
    • 2011-08-26
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2021-03-17
    • 2012-02-24
    相关资源
    最近更新 更多