正如在对象的内存布局中对象头的类型指针部分的描述,
查找对象的元数据信息并不需要经过对象本身
Java程序通过栈上的reference数据来操作堆上的具体对象,而对象的访问取决于虚拟机的具体实现。目前主流的访问方式有两种:
- 句柄
- 直接指针
句柄
使用句柄访问时,Java堆总将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。
直接指针
使用直接指针访问,reference中存储的直接就是对象地址。
两种方式各有优势,使用句柄来访问的好处就是reference中存储的是稳定的句柄地址,在对象被移动时(垃圾回收时经常发生)只会改变句柄中的实例数据指针,而reference本身不需要修改。
使用直接指针访问的优势,便是速度快,它会节省一次指针定位的时间开销。