Identity Hashcode to Java Object
hashcode, java, jvmti
Solution
In theory it is possible however you have some issues.
- it is randomly generated so it is not unique. Any number of objects (though unlikely) could have the same identity hash code.
- it is not a memory location, it doesn't change when moved from Eden, around the Survivors spaces or in tenured space.
- you need to find all the object roots to potentially find it.
If you can assume it is visible to a known object like a static collection, it should be easy to navigate via reflection.
BTW Once the 64-bit OpenJDK/Oracle JVM, the identity hash code is stored in the header from offset 1, this means you can read it, or even change it using sun.misc.Unsafe. ;)
BTW2 The 31-bit hashCode (not 32-bit) stored in the header is lazily set and is also used for biased locking. i.e. once you call Object.hashCode() or System.identityHashCode() you disable biased locking for the object.
Problem
A friend of mine and I have the following bet going: It is possible to get the `Object` again from the memory by using the `Identity Hashcode` received for that `Object` using `System.identityHashCode()` in `Java`. With the restriction that it has not yet been cleaned up by the Garbage Collector. I have been looking for an answer for quite some while now and am not able to find a definite one. I think that it might be possible to do so using the `JVMTI`, but I havn't yet worked with it. Does anyone of you have an answer to that? Will buy you a coffie, if I can do so on your site ;) Thanks in advance, Felix p.s: I am saying this behaviour can be achieved and the friend of mine says it is not possible