java - Java 对象的身份哈希码

标签 java hashcode jvmti

我和我的一个 friend 打赌:

使用 System.Object 接收到的 Identity Hashcode 可以从内存中再次获取 ObjectJava 中的 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/

相关文章:

java - 在 JVMTI Agent 中访问线程局部变量

java - 如何获取堆转储中使用的对象 ID

java - SpringLayout 适用于 Windows 7 但不适用于 NetBSD?

java - 将 map 转换为数据类

.Net GetHashcode 位移操作

java - 在 eclipse-Java 中重写 hashCode()

java - JVM TI 的链接库名称

java - Java 中是否有相当于 HTML 标题属性的方法?

Java 将 5 个字母的单词转换为数字需要很长时间

计算哈希MD5