首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对Java对象的引用在哪里真正存在?

对Java对象的引用在哪里真正存在?
EN

Stack Overflow用户
提问于 2019-08-29 06:53:32
回答 2查看 109关注 0票数 4

对Java对象的引用实际上在哪里存在?(例如垃圾收集)

强引用不会在垃圾收集过程中回收。hprof文件似乎记录了对象之间的连接。它们在JVM中的位置?我想也有维护它的代码吧?它与对象头有任何关系吗?

代码语言:javascript
复制
void setView(View view) {
    // This is a “reference” to the view
    this.view = view;
}

问题:

  1. 实际的参考资料在哪里?
  2. 如果不是,hprof文件从何而来?
EN

回答 2

Stack Overflow用户

发布于 2019-08-29 08:13:55

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

在记忆中。或者在堆中,或者在线程堆栈上,或者(在某些情况下)在JVM知道的其他位置上。总是在记忆里。

强引用不会在垃圾收集过程中回收。

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

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

确实如此。

它们在JVM中的位置。

这些联系是参考资料。如果对象a在其实例变量中有对对象b的引用,那么a将在hprof文件中显示为“连接”到b

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

我想也有维护它的代码吧?

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

它与对象头有任何关系吗?

算是吧。生成hprof文件的代码可以理解对象头。

实际的参考资料在哪里?

在记忆中;见上面。

如果不是,hprof文件从何而来?

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

票数 4
EN

Stack Overflow用户

发布于 2019-08-29 07:41:42

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

与所有其他程序一样,变量或对象驻留在内存中。程序或函数在执行前与函数参数和其他变量一起加载到内存中。静态变量和函数参数存储在内存布局的堆栈中,而动态内存分配则存储在程序堆栈布局的堆段中。如果您对程序堆栈布局/框架感到困惑,我建议检查这个答案在这里

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

我不确定这件事。据我所知,当程序执行者提出要求时,它会从堆中创建转储。这只是一个有堆转储的文件。在Android的情况下,应该在运行分析器并添加特定指令为您创建堆转储时创建它。不过,我不太清楚这点。这是一段旧视频,它可能会让您了解如何生成hprof文件。开发人员文档还告诉您如何创建堆转储。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57704607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档