JVMS说:
在Java虚拟机的一些Oracles实现中,对类实例的引用是指向句柄的指针,句柄本身就是一对指针:一个指向包含对象方法的表,一个指向表示对象类型的类对象的指针,另一个指向从堆中为对象数据分配的内存。
我不明白为什么引用会以这种方式实现,而不是使它们成为方法表指针的指针,直接跟在对象数据后面。这将避免在创建对象时分配额外的内存,并避免在字段访问时取消引用额外的指针。
Oracle这样实现它们的原因是什么?
这样的策略将允许在内存中移动对象,而不需要调整所有现有的引用,因为只需要调整一个直接指针。移动内存中的对象将通过复制或压缩垃圾收集器来完成。
但是,对于所有最近的JVM实现来说,这种间接的成本被认为不值得节省,因此一些Oracles实现实际上意味着Oracle在购买Sun时从Sun获得的一些非常旧的JVM。当今现实世界中的JVM在内存中移动对象时确实会调整所有引用。
换句话说,对于仍在使用的jvm,这是一种过时的说法,但在规范中作为一种替代实现策略的示例保留了下来。