3 回答
TA贡献1806条经验 获得超5个赞
虽然在许多VM上,引用的大小是本机指针的大小(即32位JVM的32位和64位JVM的64位),但不能保证-特别是HotSpot现在或不久将支持“ “压缩的糟糕”,这是64位JVM中的32位引用。(这并不意味着每个参考都经过压缩-请阅读链接的文章以获取更多信息,并且还有很多与此相关的博客文章。)
在回应另一条评论时,请注意,引用本身通常只是解决对象本身的一种方式。无论它是不是直接的内存指针,它的目标都是获取对象的数据。基本上,这才是真正重要的。如果有一些“备用”位(例如,它是一个64位引用,而您并不需要全部宽度来表示对象的位置),则VM可以将该数据用于其他信息,例如其类型,这可能允许一些优化。(有关更多详细信息,请参见Tom的评论。)
对象本身包含类型信息(可能以对的实例的引用Class或类似的形式-我不太了解),以及在到达用户之前在标头中包含其他必要的“内容”对象的数据。
TA贡献1942条经验 获得超3个赞
它不是JLS或JVM Spec的一部分,但实际上它是一个地址:32位CPU上的32位,64位上的64位。
pqism:好的,因为在编译之后,我们不再关心声明的类型了吗?
我们在乎。这就是为什么Class对象在那里的原因。实际上,从其他答案中您可以看到,我们对运行时中的类型足够重视,可以通过将部分类型信息作为参考来优化我们使用它们的方式。
TA贡献1828条经验 获得超13个赞
对象引用的大小取决于JVM和机器体系结构。通常,在32位计算机上为32位,在64位计算机上为64位。但是,我认为OpenJDK 7 JVM将支持“压缩指针”,这将在64位计算机上节省一些空间。
有关对象类型的信息存储在对象本身中。也就是说,如果遵循该对象的32位或64位指针(或更可能是句柄),则会找到另一个指向Class
描述该类型以及该对象的数据字段的实例的指针。
添加回答
举报