我和我的一个 friend 打赌:
使用 System.
。限制它还没有被垃圾收集器清理。Object
接收到的 Identity Hashcode
可以从内存中再次获取 Object
。 Java
中的 identityHashCode()
我一直在寻找答案很长一段时间,但一直找不到确切的答案。
我认为使用 JVMTI
可以做到这一点,但我还没有使用过它。
你们中有人对此有答案吗?如果我能在你的网站上这样做的话,我会给你买杯咖啡 ;)
提前致谢, 菲利克斯
p.s: 我是说这个行为可以实现,我的 friend 说不可能
最佳答案
理论上这是可能的,但是您遇到了一些问题。
- 它是随机生成的,因此不是唯一的。任何数量的对象(尽管不太可能)都可以具有相同的身份哈希码。
- 它不是内存位置,当从伊甸园、幸存者空间周围或终身空间中移动时,它不会改变。
- 您需要找到所有对象根才能找到它。
如果您可以假设它对已知对象(如静态集合)可见,则应该很容易通过反射进行导航。
顺便说一句,在 64 位 OpenJDK/Oracle JVM 中,身份哈希码存储在从偏移量 1 开始的 header 中,这意味着您可以读取它,甚至可以使用 sun.misc.Unsafe 更改它。 ;)
BTW2 header 中存储的 31 位 hashCode(不是 32 位)是惰性设置的,也用于偏向锁。即,一旦您调用 Object.hashCode() 或 System.identityHashCode(),您就禁用了对象的偏向锁定。
关于java - Java 对象的身份哈希码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20655372/