在 JVM 的内存模型里,当程序需要访问堆上的对象时,虚拟机必须通过某种方式找到该对象的实际地址。这就是所谓的'对象定位'。
早期的设计中有两种主流方案:句柄池和直接指针。
句柄池模式 对象本身存储在堆中,而引用指向一个句柄池里的句柄。句柄里包含了对象实例数据的指针和类型信息的指针。这种方式的优点是句柄位置稳定,GC 移动对象时只需修改句柄内的指针,引用本身不用变。但缺点是多了一层间接寻址,访问速度稍慢。
直接指针模式 引用直接指向对象的首地址。这种方式访问效率最高,因为少了一次间接跳转。不过当 GC 发生对象移动时,所有持有该对象引用的地方都需要更新。
HotSpot 虚拟机最终选择了直接指针作为默认策略。这主要是为了追求极致的访问性能,毕竟现代 CPU 对指令流水线的优化使得直接寻址的优势更为明显。当然,这也意味着在垃圾回收阶段,虚拟机需要处理更多的引用更新工作。
理解这两种机制的差异,有助于我们更好地把握 JVM 底层的内存管理逻辑。

