参考《深入理解Java虚拟机》
1 场景
java创建好对象后,访问对象的时候,java程序需要通过栈上的reference引用来操作堆上的具体对象。
JVM规范未规定对象的访问方式,对象的访问方式由虚拟机决定。
2 版本
JDK:1.8
虚拟机:hotspot
3 说明
主流的对象访问方式有:句柄和直接指针两种。
普遍使用的Hot Spot虚拟机,使用的是直接指针的方式。
3.1 句柄
java堆中划分一块内存作为句柄池,reference中存储的是句柄的地址。
句柄中包含了“对象实例数据”和“类型数据”各自的具体地址。
3.1.1 图示

3.1.2 特点
- 优点
reference中存储的是稳定不变的句柄地址。
当进行垃圾回收的时候,如果对象被移动(内存地址发生变动),只需要更改堆中句柄池中句柄的地址,栈上的reference本身不需要进行更改。
- 缺点
通过reference访问句柄池中的句柄,需要一次指针定位;访问对象实例数据,需要一次指针定位;访问对象类型数据,需要一次指针定位。
每次访问一个对象,需要进行三次指针定位。
3.2 直接指针
reference中存储的是对象的地址,对象实例数据中存储类型的指针地址。
3.2.1 图示

3.2.2 特点
- 优点
通过栈上reference访问句柄池中的句柄,需要一次指针定位;访问对象类型数据,需要一次指针定位。每次访问一个
对象,需要进行两次指针定位。
和句柄的方式比,最大的好处是速度快,reference直接存储的是对象实例数据的地址,节省了一次对象实例指针定位的时间开销。
因为对象的访问在Java中非常频繁,这类开销多了后是非常可观的执行成本。
- 缺点
进行GC回收的时候,对象存储位置如果在堆上发生变动,栈上reference上的地址将发生变动。









