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

45 java

作为一个程序员,我认为这些是寻找像"java.lang.Object中的地址1a234552"或类似的相似s

Object s = "hello";
Run Code Online (Sandbox Code Playgroud)

它是否正确?因此所有引用都是固定大小的?

Jon*_*eet 57

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

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

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

  • Azul确实将一些类型信息放入oop中.IIRC,48位用于地址,16位用于类型信息(我可能稍微在那里,特别是如果48位底部的一些位总是为零).我相信这允许快速检查内联的,非变形的虚方法调用. (2认同)
  • @santiagobasulto:它会因虚拟机而异。但不是很多 - 对类信息的引用,指示其监视器的内容(锁定状态等),以及可能由垃圾收集器使用的内容。 (2认同)

Geo*_*uba 9

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

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

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

  • @pqism - 引用本身可能只是指向实际对象的指针.类型信息将与其余的对象数据一起存储.也许更好的问题是"java对象的最小大小是什么,它包含什么?" (2认同)