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

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

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

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

1 句柄

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

信息。

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

而 reference 本身不需要被修改。

2 直接指针

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

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

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

相关推荐
皇族崛起6 分钟前
【docker安装部署】- 一个可用的Docker 镜像配置 和 DNS配置
java·docker·容器
互亿无线明明13 分钟前
国际短信通知服务:如何为全球业务构建稳定的跨国消息触达体系?
java·c语言·python·php·objective-c·ruby·composer
深盾科技13 分钟前
Linux跨进程内存操作的3种方法及防护方案
java·linux·网络
Jerry9527062817 分钟前
1.什么式可用性
java·分布式·后端·架构·高可用·秒杀
轻描淡写60618 分钟前
二进制存储数据
java·开发语言·算法
君爱学习39 分钟前
JVM对象分配内存如何保证线程安全?
java
yueqc11 小时前
虚拟机(一):JVM
jvm
一点晖光1 小时前
Docker 中 Crontab 不执行的原因与解决方案
java·docker·定时任务
BD_Marathon1 小时前
【JavaWeb】Tomcat_部署项目方式
java·tomcat
倔强的小石头_1 小时前
Python 从入门到实战(六):字典(关联数据的 “高效管家”)
java·服务器·python