Java中的对象引用有多大,它究竟包含哪些信息?

时间:2009-06-11 13:28:06

标签: java

作为程序员,我认为这些看起来像“地址1a234552处的java.lang.Object”或类似于

中的s之类的东西
Object s = "hello";

这是对的吗?因此所有引用都是固定大小的?

5 个答案:

答案 0 :(得分:57)

虽然在许多VM上,引用的大小是本机指针大小(即32位JVM为32位,64位JVM为64位),但这并不能保证 - 特别是HotSpot现在或很快支持"Compressed Oops",它们是64位JVM中的32位引用。 (这并不意味着每个引用都被压缩 - 阅读链接的文章以获取更多信息,并且还有很多关于它的博客文章。)

在回应另一条评论时,请注意引用本身通常只是解决对象本身的一种方式。无论它是否是直接内存指针,其目标都是获取对象的数据。基本上所有真的都很重要。如果有一些“备用”位(例如,它是64位引用,并且您不需要所有宽度来表示对象的位置),则VM可以将该数据用于其他信息,例如其类型,这可能允许一些优化。 (详见Tom的评论。)

对象本身包含类型信息(可能是对Class实例的引用形式,或类似的东西 - 我不太了解)以及其他必要的“东西”在获取对象的用户数据之前,标题。

答案 1 :(得分:9)

它不是JLS或JVM Spec的一部分,但实际上它将是一个地址:32位CPU为32位,64位为64位。

  pqism:好的,你找到了,因为在编译之后我们不再关心声明的类型了吗?

我们关心。这就是Class对象的原因。事实上,从其他答案中你可以看到我们关注运行时类型,足以通过将部分类型信息引入参考来优化我们使用它们的方式。

答案 2 :(得分:3)

对象引用的大小取决于JVM和计算机体系结构。通常,在32位机器上它是32位,在64位机器上它是64位。但是,我认为OpenJDK 7 JVM将支持“压缩指针”,这将为64位计算机节省一些空间。

有关对象类型的信息存储在对象本身中;也就是说,如果您按照对象的32位或64位指针(或更可能是句柄),您会找到另一个指向Class实例的指针,该实例描述了该类型以及数据对象的字段。

答案 3 :(得分:2)

大多数人倾向于将对象的引用视为类似C语言的内存指针。虽然这在技术上并不正确,但大多数实现都将其实现为指针。例如,在压缩对象指针的情况下,JVM仅在64位平台上存储64位指针的第3至34位。其他实现也可以选择使用不同的方案:引用可以是包含所有对象的指针数组的索引。

答案 4 :(得分:1)

我只想在64-bit平台上添加0.02 $,引用可以有32 bit64 bit s。

启用32 bit(默认为启用)时,其大小可以为Compressed OOP

它可以是32 bit的另一种方式是当堆小于4 GB且它适合4 GB的初始虚拟空间时。例如:

0                            4GB
..................................................
|   < your heap fits here>    |

在这种情况下,源代码说这是UnscaledNarrowOop type of heap alignment,对于该类型,它是the references have 32 bits