JVM如何确保System.identityHashCode()永远不会改变?

but*_*ken 68 java jvm heap-memory hashcode

通常,默认实现Object.hashCode()是内存中对象的已分配地址的某个函数(尽管这不是JLS强制要求的).鉴于VM在内存中分流对象,为什么System.identityHashCode()在对象的生命周期内返回的值永远不会改变?

如果它是"一次性"计算(对象的hashCode计算一次并隐藏在对象标题或其他东西中),那么这是否意味着两个对象可能具有相同的identityHashCode(如果它们碰巧首先在内存中的相同地址)?

Tom*_*ine 40

现代JVM将值保存在对象标头中.我认为该值通常仅在首次使用时计算,以便将对象分配所花费的时间保持在最小(有时低至十几个周期).可以编译公共Sun JVM,以便所有对象的标识哈希码始终为1.

多个对象可以具有相同的标识哈希码.这是哈希码的本质.

  • 对 - 我刚刚通过synchronizer.cpp(vm运行时源代码)中的ObjectSynchronizer :: FastHashCode查看,并在生成哈希码后,看起来它将它合并到对象头中.看起来有几种可能的HashCode实现; 您提到的那个为所有对象返回1的那个用于确保VM的任何部分都不会因任何原因而认为哈希码是唯一的. (5认同)

Ste*_*nne 16

在回答第二个问题时,无论实现如何,多个对象都可以具有相同的identityHashCode.

有关javadoc中措辞的简短讨论,请参阅错误6321873,以及演示非唯一性的程序.