JVM精进之路

JVM相关问题一网打尽
帅旋
关注
充电
IT宅站长,技术博主,架构师,全网id:arthinking。

为什么Mark Word中的指针是30位?

发布于 2024-09-19 | 更新于 2024-09-19

在Java虚拟机(JVM)中,特别是在HotSpot实现里,对象头的Mark Word部分用于存储多种数据,其中包括锁信息、哈希码、GC年龄等。当对象被锁定时,例如在轻量级锁定状态下,Mark Word中会包含一个指针,指向线程栈上的锁记录(Lock Record)。这种指针不需要使用完整的32位来表示。

为何使用30位指针

地址对齐:在大多数现代计算机架构中,数据通常按照一定的字节界限进行对齐。例如,假设每个对象或基本数据类型都至少按4字节(32位)或8字节(64位)对齐。这种对齐意味着地址的最低2或3位总是0(因为4的二进制表示是100,8的二进制表示是1000),因此这些位可以用于其他目的。

节省空间:在Mark Word中,每一位都是宝贵的。通过利用内存地址的自然对齐属性,可以释放几个位来存储其他状态信息。对于指向线程栈中锁记录的指针,通常只需要30位,因为线程栈的大小和对象的对齐方式确保了这些地址的低位总是固定的(比如最低的2位是00),这样就可以省略这部分,用剩余的位来表示更多的信息。

标记信息:在JVM中,Mark Word的不同状态(如未锁定、轻量级锁定、重量级锁定、GC标记等)需要存储额外的标记或标志。为了容纳这些标记,一些位需要从指针字段中“借用”。

30位指针的具体使用

在32位系统中,如果我们知道所有线程栈的地址范围始终在4GB的内存限制内,并且地址是按4字节或更大的单元对齐的,那么实际有效的地址位数可能只有30位。这样,Mark Word可以使用剩下的2位来存储锁的状态或其他标记信息

这种类型的内存和指针管理策略是JVM性能优化中的常见做法,允许JVM在紧凑的空间内有效地存储和管理对象状态。

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/faqs/jvm/why-is-the-pointer-in-mark-word-30-bits.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。

请帅旋喝一杯咖啡

咖啡=电量,给帅旋充杯咖啡,他会满电写代码!

IT宅

关注公众号及时获取网站内容更新。