为什么Java对象的指针指向指针?

Ste*_*fan 2 java pointers jvm language-design

JVMS

在Oracle对Java虚拟机的一些实现中,对类实例的引用是指向本身是一对指针的句柄的指针:一个指向包含对象方法的表的指针,以及指向表示对象的Class对象的指针对象的类型,另一个分配给从堆为对象数据分配的内存。

我不明白为什么引用会以这种方式实现,而不是使它们成为直接指向对象数据后的方法表指针的指针。这样可以避免在对象创建时分配额外的内存,而在字段访问时避免额外的指针取消引用。

Oracle如此实施它们的原因是什么?

Hol*_*ger 7

这种策略将允许在内存中移动对象而无需修改所有现有引用,因为仅需要修改一个直接指针。在内存中移动对象将通过复制或压缩垃圾收集器来完成。

但是,对于所有最近的JVM实现,都认为节省这种间接成本是不值得的,因此“ Oracle的某些实现”实际上意味着“ Oracle从Sun购买的Sun的一些非常老的JVM”。在内存中移动对象时,当今的现实世界中的JVM确实会适应所有引用。

换句话说,这是关于仍在使用的JVM的过时声明,但是作为替代实现策略的示例保留在规范中。