JVM之对象的访问定位

在Java虚拟机中,对象类型的数据放在方法区,而对象实例的数据放在java堆中。

如果要访问对象,一般有两种方式:一种是使用句柄,另一种是直接指针式地访问对象。

一、句柄访问

Java堆中会划分出一块内存来作为句柄池,而reference中存储的就是对象的句柄地址,而句柄中分别存放了对象实例数据和对象类型数据各自的地址信息。

优点:对象发生变化的时候只需要修改句柄池中的指针而不需要修改reference。

缺点:运行速度会受到影响(需要两次指针定位)。

二、使用指针(HotSpot采用):

在这种方式下,reference中存储的就是对象地址,因此会少一次指针定位的开销。

三、两者对比

1)使用句柄的最大好处就是reference中存储的是稳定的句柄地址,在对象被移动(比如GC)时只会改变句柄中的实例数据指针,而reference本身不需要修改。

2)使用指针访问方式的最大好处就是速度更快,它节省了一次指针定位的开销。由于对象的访问在Java中非常频繁,因此这类开销积少成多以后也是一项非常可观的执行成本。

猜你喜欢

转载自blog.csdn.net/qq_41834553/article/details/113796393