Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java对象的标识哈希代码_Java_Hashcode_Jvmti - Fatal编程技术网

Java对象的标识哈希代码

Java对象的标识哈希代码,java,hashcode,jvmti,Java,Hashcode,Jvmti,我和我的一个朋友打赌如下: 使用Java中的System.identityHashCode()为对象接收的标识Hashcode可以再次从内存中获取对象。限制它尚未被垃圾收集器清除 我一直在寻找一个答案已经有一段时间了,现在还不能找到一个明确的答案 我认为使用JVMTI可以做到这一点,但我还没有使用它 你们有人能回答这个问题吗?我会给你买棺材,如果我能在你的网站上这么做;) 提前感谢,, 费利克斯 p、 学生:我是说这种行为是可以实现的,我的朋友说这是不可能的理论上是可能的,但是你有一些问题 它

我和我的一个朋友打赌如下:

使用
Java
中的
System.identityHashCode()
对象
接收的
标识Hashcode
可以再次从内存中获取
对象。限制它尚未被垃圾收集器清除

我一直在寻找一个答案已经有一段时间了,现在还不能找到一个明确的答案

我认为使用
JVMTI
可以做到这一点,但我还没有使用它

你们有人能回答这个问题吗?我会给你买棺材,如果我能在你的网站上这么做;)

提前感谢,, 费利克斯


p、 学生:我是说这种行为是可以实现的,我的朋友说这是不可能的

理论上是可能的,但是你有一些问题

  • 它是随机生成的,因此不是唯一的。任何数量的对象(尽管不太可能)都可能具有相同的标识哈希代码
  • 它不是一个记忆位置,当从伊甸园、幸存者空间或终身空间移动时,它不会改变
  • 您需要找到所有对象根才能找到它
如果您可以假设它对于静态集合这样的已知对象是可见的,那么通过反射导航应该很容易

顺便说一句,一旦64位OpenJDK/Oracle JVM启动,标识哈希代码将从偏移量1存储在标头中,这意味着您可以读取它,甚至可以使用sun.misc.Unsafe对其进行更改


BTW2头中存储的31位哈希代码(不是32位)是延迟设置的,也用于偏置锁定。i、 一旦你调用Object.hashCode()或System.identityHashCode(),你就可以禁用对象的有偏锁定。

我想你的朋友会赢这场赌注的。Java/JVM为您管理内存,一旦您删除了对某些内容的所有引用,就无法访问它

幻象引用、弱引用等都是为了允许您描述的内容而设计的-因此,如果您保留对某个内容的弱引用或幻象引用,您可以。但identityHashCode两者都不是


C和C++可能会让你这样做,因为你有更直接的内存控制,但即使如此,你也需要内存位置而不是哈希。

< P>不,因为IdHythHash码不一定是唯一的。它们不是指向对象的指针。

否。
标识hashCode
不一定是内存地址:它只是
hashCode
的默认实现。它也不能保证对所有对象都是唯一的(但是不同的实例应该有不同的identityhashcode)


即使identityHashCode是从内存地址派生的,也可以重新分配对象(但是identityHashCode根据定义不能改变)

。。。C/C++有指向内存地址的引用/指针,这使查找它们变得更容易。好的,谢谢,我将查看那些
引用
:)当对象在不同代之间移动时,哈希代码不会更改,因此可以假定它不是内存地址。;)正确的。我写这篇文章仅仅是因为我想明确指出Object.hashCode文档中的注释“这通常是通过将对象的内部地址转换成整数来实现的”。我的观点是“内部地址”与任何实际地址都不对应。你可以证明具有相同地址的对象,例如,在GC之后,它们位于Eden空间的底部,你可以证明它们具有相同的地址,但每次都有不同的哈希代码。好吧,今天我学到了一些东西!谢谢你的详细回答。“我在哪里可以给你买棺材?”丽特尔当我在城里的时候,这些天我经常旅行主要是美国和欧洲。@Rittel添加了一个更模糊的注释;)哈哈好的:D如果我能组织一个棺材,我会很高兴的;)彼得如果你碰巧在新加坡,你会有一款很棒的亚美尼亚葡萄酒或白兰地等着你:D