我的一个朋友和我有以下赌注:
这是有可能得到Object
从存储器使用再次Identity Hashcode
收到对Object
使用System.identityHashCode()
在Java
.受垃圾收集器尚未清除的限制.
我一直在寻找一个答案,而且我找不到明确的答案.
我认为使用它可能会这样做JVMTI
,但我还没有使用它.
你们中有谁对此有答案吗?如果我能在你的网站上这样做,会给你买一个coffie;)
菲利克斯提前谢谢你
ps:我说这种行为可以实现,而我的朋友说这是不可能的
从理论上讲,你可能会遇到一些问题.
它是随机生成的,因此它不是唯一的.任意数量的对象(尽管不太可能)都可以具有相同的标识哈希码.
它不是一个记忆位置,当从伊甸园,幸存者空间或终身空间移动时它不会改变.
你需要找到所有的对象根来找到它.
如果您可以假设它对于静态集合等已知对象是可见的,则应该很容易通过反射进行导航.
BTW一旦64位OpenJDK/Oracle JVM,身份哈希码存储在偏移量为1的标题中,这意味着您可以读取它,甚至可以使用sun.misc.Unsafe更改它.;)
BTW2标头中存储的31位hashCode(非32位)是懒惰设置,也用于偏置锁定.即,一旦调用Object.hashCode()或System.identityHashCode(),就会禁用对象的偏向锁定.