在Java虚拟机中,对象类型的数据放在方法区,而对象实例的数据放在java堆中。
如果要访问对象,一般有两种方式:一种是使用句柄,另一种是直接指针式地访问对象。
一、句柄访问
Java堆中会划分出一块内存来作为句柄池,而reference中存储的就是对象的句柄地址,而句柄中分别存放了对象实例数据和对象类型数据各自的地址信息。
优点:对象发生变化的时候只需要修改句柄池中的指针而不需要修改reference。
缺点:运行速度会受到影响(需要两次指针定位)。
二、使用指针(HotSpot采用):
在这种方式下,reference中存储的就是对象地址,因此会少一次指针定位的开销。
三、两者对比
1)使用句柄的最大好处就是reference中存储的是稳定的句柄地址,在对象被移动(比如GC)时只会改变句柄中的实例数据指针,而reference本身不需要修改。
2)使用指针访问方式的最大好处就是速度更快,它节省了一次指针定位的开销。由于对象的访问在Java中非常频繁,因此这类开销积少成多以后也是一项非常可观的执行成本。