文档章节

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

晨猫
 晨猫
发布于 2018/02/16 02:11
字数 635
阅读 51
收藏 0

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

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

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

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

© 著作权归作者所有

晨猫
粉丝 41
博文 444
码字总数 137257
作品 0
杭州
后端工程师
私信 提问
加载中

评论(3)

晨猫
晨猫 博主

引用来自“wliang777”的评论

对象的访问定位
两种机制,分别在什么时候会用到。
对于Oracle的HotSpot虚拟机而言,使用直接指针访问。
w
wliang777
对象的访问定位
两种机制,分别在什么时候会用到。
w
wliang777
对象的访问定位
两种机制,分别在什么时候会用到。
对象访问定位

句柄访问 jvm栈中的引用类型指向java堆里的句柄池,句柄池指针分别指向对象实例和类型;好处是:引用类型指针永远指向句柄池地址,新的对象创建的时候只是句柄池指针有变化而已; 直接指针访...

清尘V
2016/04/28
6
0
JVM系列2:HotSpot虚拟机对象

1.对象创建过程:   ①.类加载检查:当java虚拟机遇到一条new指令时,首先会去检查该指令的参数能否在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析、初...

Ala6
2018/10/10
325
1
JVM学习系列之对象访问的两种方式句柄和直接指针

使用Java开发的人都清楚在Java中对象引用作用类似C++中指针,通过对象引用定位对象,但是具体在JVM中又是采用什么方式去定位堆中对象的具体位置,大部分人都不太了解,这里我们讲述下不同Jav...

老韭菜
2018/08/01
23
0
Java虚拟机学习(三)

对象的创建 HotSpot虚拟机中,当我们使用new关键字创建一个对象的时候,虚拟机会做如下的操作: 查看方法区中的常量池是否能定位到对象类的符号引用,并且检查这个引用是否被加载过、解析和初...

casoc
2016/05/30
63
0
JVM笔记 2.3 HotSpot虚拟机对象探秘

1. 对象创建 在语言层次上创建一个对象,只是一个简单的new关键字,但在虚拟机中对象的创建有如下的过程 先检查能不能在常量池中定位到符号引用,并检查这个类是否已经被加载,解析,初始化过...

蠢廿
2017/11/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

教你玩转Linux—添加批量用户

添加和删除用户对每位Linux系统管理员都是轻而易举的事,比较棘手的是如果要添加几十个、上百个甚至上千个用户时,我们不太可能还使用useradd一个一个地添加,必然要找一种简便的创建大量用户...

xiangyunyan
14分钟前
3
0
返回提示信息,如:xxx创建成功!

【服务端】在输出的方法块中,加入要输出的字段(qcm_batch_id) QCMUserType.cs: public struct QCM_Custom_Create_Batch_Out_Tag { public BASCoreType.Cmn_Out_T......

_Somuns
14分钟前
3
0
Aliyun Serverless VSCode Extension v1.12.0 发布

Aliyun Serverless VSCode Extension 是阿里云 Serverless 产品 函数计算 Function Compute 的 VSCode 插件,该插件结合了函数计算 Fun 工具以及函数计算 SDK ,是一款 VSCode 图形化开发调试...

阿里云官方博客
15分钟前
4
0
程序员如何培养解决复杂问题的能力?

今天在上网时候,突然看到了这篇文章,感觉非常的适合现在的自己去思考下,可能也适用在座的读者。程序员不仅仅是敲代码,更是一个复合能力的结合体,也不仅仅停留在技术和代码阶段。你想要成...

哥本哈根的小哥
19分钟前
6
0
市场变化驱动产品思维升级

宜信科技中心财富管理产品部负责人Bob,与大家一起聊聊个性化推荐产品功能的设计和B端产品的功能策划方式。 拓展阅读:回归架构本质,重新理解微服务 智慧金融时代,大数据和AI如何为业务赋能...

宜信技术学院
19分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部