You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中32位hashCode如何存入25位mark word且无数据丢失?

Java对象hashCode与对象头Mark Word的存储机制解析

针对你提出的两个问题,结合HotSpot VM(Oracle/Sun JDK默认虚拟机)的实现细节,直接解析如下:


问题1:32位hashCode如何存入25位的Mark Word?

不存在无数据丢失的存储方式。HotSpot VM中,对象头的Mark Word在无锁、无偏向的状态下,仅分配25位空间用于存储hashCode的部分值。当第一次调用hashCode()或System.identityHashCode()时,JVM会生成一个32位随机整数作为对象的identity hash code,随后只将这个32位值的低25位写入Mark Word的对应字段,剩余7位会被直接丢弃。

这里的核心逻辑是:Mark Word中的25位只是hashCode的“优化存储位”,用于快速判断等性能场景,并非完整hashCode的唯一承载容器。


问题2:为何再次调用hashCode()仍能获取原始32位值?

JVM生成完整的32位hashCode后,会将其缓存到对象对应类元数据(Klass)的内部结构中,而非仅依赖Mark Word存储。后续调用hashCode()时,JVM会直接从这个内部缓存读取完整的32位值,完全不需要从Mark Word的25位中重构。

简单来说,Mark Word中的25位只是hashCode的“缩略版”,用于特定场景的性能优化,完整的hashCode始终由JVM在后台持久化缓存,因此不会出现调用时返回截断值的情况。


补充说明:

  • 若对象的Mark Word状态发生变化(比如进入偏向锁、轻量级锁状态),其中的25位hashCode字段会被覆盖,但JVM依然能从内部缓存中获取完整的hashCode。
  • 自定义的hashCode()方法(非Object类的identity hash code)不受此机制影响,因为自定义实现的返回值不会存入Mark Word,只有JVM生成的identity hash code才走这套存储逻辑。

内容的提问来源于stack exchange,提问作者SadMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:50:13