将Hashcode标识为Java对象

Rit*_*tel 4 java hashcode jvmti

我的一个朋友和我有以下赌注:

这是有可能得到Object从存储器使用再次Identity Hashcode收到对Object使用System.identityHashCode()Java.受垃圾收集器尚未清除的限制.

我一直在寻找一个答案,而且我找不到明确的答案.

我认为使用它可能会这样做JVMTI,但我还没有使用它.

你们中有谁对此有答案吗?如果我能在你的网站上这样做,会给你买一个coffie;)

菲利克斯提前谢谢你

ps:我说这种行为可以实现,而我的朋友说这是不可能的

Pet*_*rey 7

从理论上讲,你可能会遇到一些问题.

  • 它是随机生成的,因此它不是唯一的.任意数量的对象(尽管不太可能)都可以具有相同的标识哈希码.
  • 它不是一个记忆位置,当从伊甸园,幸存者空间或终身空间移动时它不会改变.
  • 你需要找到所有的对象根来找到它.

如果您可以假设它对于静态集合等已知对象是可见的,则应该很容易通过反射进行导航.

BTW一旦64位OpenJDK/Oracle JVM,身份哈希码存储在偏移量为1的标题中,这意味着您可以读取它,甚至可以使用sun.misc.Unsafe更改它.;)

BTW2标头中存储的31位hashCode(非32位)是懒惰设置,也用于偏置锁定.即,一旦调用Object.hashCode()或System.identityHashCode(),就会禁用对象的偏向锁定.