gpt4 book ai didi

java - Java 对象的身份哈希码

转载 作者:搜寻专家 更新时间:2023-11-01 01:43:26 27 4
gpt4 key购买 nike

我和我的一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com