Java程序通过栈上的reference数据来操作堆上的具体对象。reference类型在是一个指向对象的引用,它通过什么方式去定位、访问到堆中对象的具体位置,是由虚拟机实现而定的,主流的访问方式主要有使用句柄和直接指针两种
使用句柄
在Java堆中划分一块内存作为句柄池,reference中存储的是对象的句柄地址,句柄中包含了队形的实例数据与类型数据各自的地址信息。如下图所示:
使用句柄的优点是reference存储的是稳定句柄地址,在对象被移动(例如垃圾收集)时只会改变句柄的示例数据指针,reference本身不需要修改。
直接指针
reference中存储的直接就是对象地址,Java对象中存在到对象类型数据的指针(对象头中)。如下所示:
使用直接指针的优点是速度更快,它节省了一次指针定位的时间开销。
HotSpot虚拟机主要使用第二种方式进行对象访问。