将Hashcode标识为Java对象

 大伟 发布于 2023-02-09 14:55

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

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

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

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

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

菲利克斯提前谢谢你

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

1 个回答
  • 从理论上讲,你可能会遇到一些问题.

    它是随机生成的,因此它不是唯一的.任意数量的对象(尽管不太可能)都可以具有相同的标识哈希码.

    它不是一个记忆位置,当从伊甸园,幸存者空间或终身空间移动时它不会改变.

    你需要找到所有的对象根来找到它.

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

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

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

    2023-02-09 14:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有