对象的访问定位 - 句柄、指针

创建对象是为了使用对象,咱们的Java程序须要经过栈上的reference数据来操做堆上的具体对象。因为reference 类型在Java虚拟机规范中只规定了一个指向对象的引用,并无定义这个引用应该经过何种方式去定位、访问堆中的对象的具体位置,因此对象访问方式也是取决于虚拟机实现而定的。目前主流的访问方式有使用句柄和直接指针两种。
1、句柄访问方式:
若是使用句柄访问的话,那么Java 堆中将会划分出一块内存来做为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据(类信息,方法类型信息)各自的具体地址信息,以下图所示。

句柄方式访问 
2、指针访问方式: 
若是使用直接指针访问,那么Java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而reference 中存储的直接就是对象地址,以下图所示。
指针访问方式 java

这两种对象访问方式各有优点: 
使用句柄来访问的最大的好处就是reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是很是广泛的行为) 时只会改变句柄中的实例数据指针,而reference 自己不须要修改。
使用直接指针访问方式的最大好处就是速度更快,它节省了一次指针定位的时间开销,因为对象的访问在Java中很是频繁,所以这类开销聚沙成塔后也是一项很是可观的执行成本。
对于Oracle的HotSpot虚拟机而言,它是使用第二种方式进行对象访问的,但从整个软件开发的范围来看,各类语言和框架使用句柄来访问的状况也十分常见。框架

 取自《深刻理解java虚拟机第二版》2.3.3 对象的访问定位布局

相关文章
相关标签/搜索