使用Java开发的人都清楚在Java中对象引用做用相似C++中指针,经过对象引用定位对象,可是具体在JVM中又是采用什么方式去定位堆中对象的具体位置,大部分人都不太了解,这里咱们讲述下不一样Java虚拟机主要使用的两种对象访问方式,句柄访问和直接指针访问。spa
图1-1指针
虚拟机若是使用句柄访问方式,Java堆中首先会划分出一块内存做为句柄池,这时候对象引用reference存储的就是对象的句柄地址而不是做为对象指针指向堆中对象的地址,而句柄池中的对象实例包含指向对象实例数据和类型数据的指针,采用句柄访问方式要得到完整的对象信息须要进行三次指针定位。对象
直接指针访问对象,Java虚拟机须要在堆中为对象分配额外的空间存储指向方法区对象类型数据的指针,采用直接指针访问方式,对象引用直接存储堆中对象的地址,只须要进行两次指针定位。目前hot spot就是采用这种对象访问方式。blog
两种方式各有优劣,使用句柄访问的好处是在每次对象位置发生变更时只须要改变句柄中指向实例数据的指针,而指向对象类型数据的指针和对象引用指针reference都不须要修改,而使用直接指针访问,当对象发生移动时对象引用reference须要修改。可是使用直接指针访问方式少了一次指针定位的时间开销速度更快。内存