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

2019独角兽企业重金招聘Python工程师标准>>>

6936d1565ae689371725cdb5fc51c415.png

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

1 - 句柄访问

b49fdbda3dc7f5071e9b3e8ad3ca0b9f.png

图1-1

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

2 - 直接指针访问

a8da35bb2e2f43ce2b93a4869bf0c071.png

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值