对Java对象的引用实际上在哪里存在?(例如垃圾收集)
强引用不会在垃圾收集过程中回收。hprof文件似乎记录了对象之间的连接。它们在JVM中的位置?我想也有维护它的代码吧?它与对象头有任何关系吗?
void setView(View view) {
// This is a “reference” to the view
this.view = view;
}问题:
hprof文件从何而来?发布于 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对话的工具编写的。(我不能百分之百确定是哪一个,但这并不重要。)
发布于 2019-08-29 07:41:42
对Java对象的引用实际上在哪里存在?
与所有其他程序一样,变量或对象驻留在内存中。程序或函数在执行前与函数参数和其他变量一起加载到内存中。静态变量和函数参数存储在内存布局的堆栈中,而动态内存分配则存储在程序堆栈布局的堆段中。如果您对程序堆栈布局/框架感到困惑,我建议检查这个答案在这里。
hprof文件似乎记录了对象之间的连接。它们在JVM中的位置?
我不确定这件事。据我所知,当程序执行者提出要求时,它会从堆中创建转储。这只是一个有堆转储的文件。在Android的情况下,应该在运行分析器并添加特定指令为您创建堆转储时创建它。不过,我不太清楚这点。这是一段旧视频,它可能会让您了解如何生成hprof文件。开发人员文档还告诉您如何创建堆转储。
https://stackoverflow.com/questions/57704607
复制相似问题