CodeWalk

对象访问定位的两种方式对比

作者:我还是少年 · 2026-05-30 12:55

Java对象在堆中创建后,栈上的引用如何定位到对象?请对比句柄访问和直接指针访问的优缺点。

回答

我还是少年

对象访问定位有两种主流方式:

1. 句柄访问

  • Java栈的reference指向堆中句柄池,句柄池包含对象实例数据和类型数据的地址。
  • 优点:GC移动对象时只需更新句柄中的指针,reference不变,对用户透明。
  • 缺点:两次指针访问,速度慢。

2. 直接指针(HotSpot默认)

  • reference直接指向堆中对象实例数据,对象头中存储指向方法区类型数据的指针。
  • 优点:一次指针访问,速度快。
  • 缺点:GC移动对象时需要更新所有reference。

HotSpot使用直接指针方式访问,因为GC停顿是主要优化目标,而对象访问频率极高,性能收益大于GC时的指针更新成本。