首页 > 解决方案 > 为什么Java对象指向指针?

问题描述

JVMS

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

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

甲骨文这样实施它们的原因是什么?

标签: javapointersjvmlanguage-design

解决方案


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

然而,对于所有最近的 JVM 实现,这种间接的成本被认为不值得节省,因此“一些 Oracle 的实现”实际上是指“Oracle 在购买 Sun 时从 Sun 获得的一些非常旧的 JVM”。当今现实世界的 JVM 在内存中移动对象时会调整所有引用。

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


推荐阅读