在虚拟机栈中的局部变量表里面存有reference,通过reference数据来操作堆上的具体对象。对象具体的访问方式取决于虚拟机的实现。目前主流的访问方式有句柄和直接指针两种。
句柄
Java堆中划分出一块内存来作为句柄池,引用中存储对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。简单理解就是指针的指针。
直接指针
如果使用直接指针访问,那么Java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而引用中存储的直接就是对象地址。
这两种对象的访问方式各有优势,使用句柄访问最大的好处就是reference中存储的是稳定的句柄地址,在对象被移动时,只用修改句柄中的实例数据指针,而reference本身不需要修改。
而直接访问对象方式的好处就是,减少一次指针定位的时间开销,由于对象的访问是非常频繁的,因此这类开销积少成多也是一项非常的执行成本。
HotSpot使用第二种方式进行访问的。