作为程序员,我认为这些看起来像“地址1a234552处的java.lang.Object”或类似于
中的s
之类的东西
Object s = "hello";
这是对的吗?因此所有引用都是固定大小的?
答案 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 bit
或64 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。