如果在 HotSpot JVM 中启用了偏置锁定,则对象的哈希代码存储在哪里?

2022-09-04 03:11:51

据我所知,对象的哈希代码通常存储在对象的标头词中,例如,该标头词在HotSpot中可能具有以下布局:

|  hash code  | age | 0 | 01 |

根据 HotSpotInternals - 启用了有偏差锁定的同步,标题字布局看起来如下:

|   0   |epoch| age | 0 | 01 |

当启用有偏差锁定时,如果需要,哈希代码实际存储在哪里?


答案 1

我的理解是,请求(身份)哈希码可以防止有偏见的锁定 - 因为我们无法将哈希码和线程ID存储在标记字中。如果您要求互斥体的哈希码,则可以转移到无偏锁定模式。

这由此博客中的以下内容支持:

“最后,标记字中目前没有空间来支持标识值以及偏置锁定编码所需的线程ID。鉴于此,您可以通过调用 来避免基于每个对象的有偏差锁定。如果对象已经有偏差,则分配标识哈希码将导致吊销,否则,分配 a 将使对象不符合后续有偏差锁定的条件。当然,此属性是我们当前实现的工件。hashCode()System.identityHashCode(o)hashCode()


答案 2

推荐