我希望能夠獲得Java堆轉儲(通過jmap或JMX等創建的)中使用的相同ID。這是爲了能夠識別仍在運行的應用程序中的活動對象,而不是相同應用程序的舊內存快照(堆轉儲)。如何獲得在堆轉儲中使用的對象ID
我已經測試了一下,它並不是hashCode,也不是JDI唯一的ID(您可以在調試器中看到)。
從檢查sun.jvm.hotspot.utilities中的代碼我假設它是內存中的對象地址。但是,我對sun.misc.Unsafe的測試也沒有導致與堆轉儲中使用的相同的id值。 (在這裏看到一些不安全的解釋:http://zeroturnaround.com/rebellabs/dangerous-code-how-to-be-unsafe-with-java-classes-objects-in-memory/)
任何想法?謝謝 :) !
對象(或其任何超級對象)是否重寫hashCode?如果是這樣,你可能會運氣['System.identityHashCode()'](http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#identityHashCode%28java.lang。 Object%29) – blazetopher
或者它可能像需要hashCode的十六進制值一樣簡單? 'Integer.toHexString(obj.hashCode())'... – blazetopher
感謝您的評論,但沒有,正如我所說的不幸的是不是hashCode。也不是System.identiyHashCode(如果它沒有被覆蓋,它與普通對象hashCode相同)。不,十六進制或十進制無關緊要。最後它是相同的價值,對吧?大多數堆轉儲分析器傾向於將值顯示爲十六進制。在我的情況下,這個值是一個簡單的長整型值(可能是因爲64位jvm)。 –