文档章节

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

 何如泛轻舟
发布于 2018/08/01 19:49
字数 595
阅读 24
收藏 2

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

1 - 句柄访问

 

图1-1

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

 

2 - 直接指针访问

 

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

 

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

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

 

© 著作权归作者所有

粉丝 15
博文 64
码字总数 107681
作品 0
杭州
后端工程师
私信 提问
JVM系列2:HotSpot虚拟机对象

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

Ala6
2018/10/10
325
1
对象的访问定位 - 句柄、指针

建立对象是为了使用对象,我们的Java程序需要通过栈上的reference数据来操作堆上的具体对象。由于reference 类型在Java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用应该通过...

晨猫
2018/02/16
52
3
Java虚拟机内存管理(二)—堆的使用

Java 与 C++ 之间有一堵由内存动态分配和垃圾收集技术所围成的 “高墙”,墙外面的人想进去,墙里面的人却想出来。——《深入理解Java虚拟机:JVM高级特性与最佳时实践(第二版)》周志明 Ja...

Wizey
2018/08/30
0
0
Java虚拟机-对象的创建和访问

一、对象的创建 创建对象在java上面是很简单的,使用new关键字就可以了,但是其实在虚拟机中,java对象的创建是一个复杂的过程。 当java虚拟机遇到一个new的指令的时候,对象创建的程序正式启...

Java猫
04/09
0
0
虚拟机篇 之「运行时数据区域及虚拟机对象」

版权声明:Follow your heart and intuition. https://blog.csdn.net/qq_35246620/article/details/81431528 温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,...

维C果糖
2018/08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
43
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部