jvm 对象的访问定位,即引用是怎么定位到内存中的对象的

对象的访问定位有两种方式:

第一种,引用使用句柄访问对象:

概念:引用存储的是一个地址,该地址是句柄的地址,而句柄是一种结构,分别存储 实例指针和类型指针 这两种指针,(实例指针是指向堆中的对象实例,而类型指针指向的是在方法区中该对象所属类型)。当要访问对象时,先通过引用访问句柄,再通过句柄访问对象实例以及对象类型信息。句柄是存储在堆中的,如果使用这种方式,那么就会从堆中分出一块内存用作句柄池。

优点:对象经过多次移动时,虚拟机只需要修改句柄中的指向对象实例的指针即可,不用修改引用。垃圾收集器移动对象还是挺频繁了,比如新生代中的从Eden区或者Survivor From区移到Survivor To区,再比如  新生代Survivor To区的对象移到老年代中等等,都是在移动对象在堆中的位置。

缺点:其实上面讲过了,通过句柄这种方式,引用访问对象需要先访问句柄,在通过句柄访问实例,需要两个步骤,而下面讲的直接指针访问只需要一个步骤即可,在一个系统中,这多一个步骤所累积起来消耗的性能也是很客观的。毕竟访问对象是一种很频繁的行为。

第二种,引用使用直接指针访问对象:

概念:引用存储的是对象实例在堆中的地址,通过引用可以直接访问对象实例,只需要经过一个步骤。这个时候只需要考虑该对象类型指针存在哪,一般对象类型指针是放在对象实例中,这样的话,只有访问对象类型信息需要经过两个步骤,并且这个行为相对于访问对象实例就不是那么频繁了。

优点:直接指针访问对象的优点其实就是第一种 句柄访问的缺点,这边不再赘述。

缺点:这个的缺点就是第一种访问方式的优点,垃圾收集器移动对象时需要修改引用。。。不过,垃圾收集器移动对象一般没有比访问对象更频繁,所以使用这种方式一半比第一种方式合算,除非垃圾收集器移动对象的行为非常频繁。

总结

在HotSpot中,使用的是第二种方式,我们常用的jvm也是HotSpot

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值