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

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

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

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

1 句柄

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

信息。

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

而 reference 本身不需要被修改。

2 直接指针

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

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

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

相关推荐
云姜.7 分钟前
线程和进程的关系
java·linux·jvm
是码龙不是码农9 分钟前
支付防重复下单|5 种幂等性设计方案(从初级到架构级)
java·架构·幂等性
曹牧9 分钟前
Spring Boot:如何在Java Controller中处理POST请求?
java·开发语言
heartbeat..9 分钟前
JVM 性能调优流程实战:从开发规范到生产应急排查
java·运维·jvm·性能优化·设计规范
WeiXiao_Hyy13 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
玄同76513 分钟前
SQLite + LLM:大模型应用落地的轻量级数据存储方案
jvm·数据库·人工智能·python·语言模型·sqlite·知识图谱
苏渡苇19 分钟前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
团子的二进制世界25 分钟前
G1垃圾收集器是如何工作的?
java·jvm·算法
Max_uuc29 分钟前
【C++ 硬核】打破嵌入式 STL 禁忌:利用 std::pmr 在“栈”上运行 std::vector
开发语言·jvm·c++
long31630 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法