总结:
建立了对象后我们要使用对象,我们的java程序需要通过栈上的reference数据来操作堆上的实例后的对象。
reference定义的数据类型在JVM中只规定了一个指向对象的引用,并没有指定这个引用通过什么方式去定位和访问堆中的对象的具体位置,所以对象的访问也是取决于虚拟机的实现而定的。
目前主流的访问方式有使用句柄和直接指针两种。
使用句柄:
如果使用句柄访问的话,那么java堆将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的地址信息,如下图所示:
使用直接指针:
reference中存储的直接就是对象的地址,如下图所示
使用句柄优点:
使用句柄的最大的好处就是reference中存储的是稳定的句柄地址,即对象移动(例如GC垃圾回收)时只会改变句柄中数据的指针,reference本身不需要修改。
使用直接指针优点:
直接指针访问方式最大的好处就是速度快,他节省了一次指针定位的时间开销,但是由于对象会经常被访问,因此这项开销积少成多后也是一项非常可观的执行成本。