【Java JVM】Java 实例对象的访问定位

Java 程序会通过栈上的 reference 数据来操作堆上的具体对象。

但是 reference 类型在《Java虚拟机规范》里面只规定了它是一个指向对象的引用, 并没有定义这个引用应该通过什么方式去定位, 访问到堆中对象的具体位置,

所以对象访问方式也是由虚拟机实现而定的,主流的访问方式主要有使用句柄直接指针两种。

1 句柄

如图: Java 堆中将可能会划分出一块内存来作为句柄池, reference 中存储的就是对象的句柄地址, 而句柄中包含了对象实例数据与类型数据各自具体的地址

信息。

使用句柄来访问的最大好处就是 reference 中存储的是稳定句柄地址, 在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,

而 reference 本身不需要被修改。

2 直接指针

如图: reference 中存储的就是对象地址, 而实例对象有一个指向具体的类型的指针。

使用直接指针来访问最大的好处就是速度更快, 它节省了一次指针定位的时间开销, 由于对象访问在 Java 中非常频繁, 因此这类开销积少成多也是一项极为可观的执行成本。

就 HotSpot 而言, 它主要使用第二种方式进行对象访问(有例外情况,如果使用了Shenandoah收集器的 话也会有一次额外的转发)。

相关推荐
hweiyu0029 分钟前
Maven 私库
java·maven
Super Rookie37 分钟前
Spring Boot 企业项目技术选型
java·spring boot·后端
写不出来就跑路43 分钟前
Spring Security架构与实战全解析
java·spring·架构
ZeroNews内网穿透1 小时前
服装零售企业跨区域运营难题破解方案
java·大数据·运维·服务器·数据库·tcp/ip·零售
sleepcattt2 小时前
Spring中Bean的实例化(xml)
xml·java·spring
lzzy_lx_20892 小时前
Spring Boot登录认证实现学习心得:从皮肤信息系统项目中学到的经验
java·spring boot·后端
Dcs2 小时前
立即卸载这些插件,别让它们偷你的资产!
java
小七mod2 小时前
【Spring】Java SPI机制及Spring Boot使用实例
java·spring boot·spring·spi·双亲委派
亿.63 小时前
【Java安全】RMI基础
java·安全·ctf·rmi
ruan1145143 小时前
Java Lambda 类型推断详解:filter() 方法与 Predicate<? super T>
java·开发语言·spring·stream