JVM学习系列之对象访问的两种方式句柄和直接指针

原创
2018/08/01 19:49
阅读数 602

    使用Java开发的人都清楚在Java中对象引用作用类似C++中指针,通过对象引用定位对象,但是具体在JVM中又是采用什么方式去定位堆中对象的具体位置,大部分人都不太了解,这里我们讲述下不同Java虚拟机主要使用的两种对象访问方式,句柄访问和直接指针访问。

1 - 句柄访问

 

图1-1

    虚拟机如果使用句柄访问方式,Java堆中首先会划分出一块内存作为句柄池,这时候对象引用reference存储的就是对象的句柄地址而不是作为对象指针指向堆中对象的地址,而句柄池中的对象实例包含指向对象实例数据和类型数据的指针,采用句柄访问方式要获得完整的对象信息需要进行三次指针定位。

 

2 - 直接指针访问

 

    直接指针访问对象,Java虚拟机需要在堆中为对象分配额外的空间存储指向方法区对象类型数据的指针,采用直接指针访问方式,对象引用直接存储堆中对象的地址,只需要进行两次指针定位。目前hot spot就是采用这种对象访问方式。

 

3 - 两种对象访问方式对比

    两种方式各有优劣,使用句柄访问的好处是在每次对象位置发生变动时只需要改变句柄中指向实例数据的指针,而指向对象类型数据的指针和对象引用指针reference都不需要修改,而使用直接指针访问,当对象发生移动时对象引用reference需要修改。但是使用直接指针访问方式少了一次指针定位的时间开销速度更快。

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部