ist es möglich die Adresse auf dem heap einer Variablen in java?
können sagen, dass ich diese variable :
...
Somekindofobject var = new Somekindofobject();
...
und ich will wissen, wo var liegt auf dem heap ( Adresse , wie 0x08 und so weiter),und drucken Sie die Adresse aus .
ist es möglich?
- Wenn alles, was Sie tun möchten, drucken Sie das Objekt, was für nutzen bekommst du aus der Kenntnis, wo es auf dem heap? Was sind Sie wirklich erreichen wollen?
- Ich denke, er meint, drucken Sie die Adresse aus.
- ich arbeite an einem Programm bekommt als Eingabe java-Programm , und Instrumente-code druckt in Datei Informationen über die variable zugreifen. Der einzige Weg, dass ich bestimmen kann, zwischen zwei Felder von Objekten der gleichen Klasse ist durch die thier-Adresse auf dem heap. Daher brauche ich die Adresse auf dem heap
- Man in der Regel Instrumente, die Java-bytecode Java-bytecode. In diesem Fall brauchen Sie nicht "die Adresse". Vielleicht gibt es andere/bessere Frage lauern hier? Wenn müssen "die Adresse" dann die einzige Möglichkeit, die ich kenne ist JNI mit pinning, aber das wird wahrscheinlich nicht funktionieren ", als Sie erwarten" - ich habe Angst.
- Sieht aus wie Sie benötigen, um ein debugging-framework, diese in der Regel irgendeine Art von eindeutigen Objekt-id.
- OK, das waren wichtige Informationen. Leider, ein Objekt-Adresse auf dem heap kann (und typischerweise wird) wird im Laufe der Zeit ändern, so dass es nicht dienen als einen eindeutigen Bezeichner.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
System.identityHashCode
um eine Vorstellung von Gleichheit.Es ist nicht perfekt, aber ziemlich gut.
Wenn Sie tun, um die heap-Adresse, ein Objekt, denken Sie daran, dass die JVM erlaubt, Objekte verschieben (und Häufig auch tut, wenn ein generational garbage-Kollektor fördert langlebigen Objekt zu einer älteren generation), so dass die heap-Position des Objekts ist nicht eine gute proxy für die Identität in allen Lebenslagen.
Könnten Sie einen Versuch geben auf diesen Artikel von javaPaper: Adresse des Java-Objekts
Es geht darum, mit der
Unsafe
Klasse in dersun.misc
Paket um die Adresse zu bekommen.Selbst wenn Sie es geschafft haben, die heap-Adresse des Objekts, es gibt keine Garantie, dass durch die Zeit Sie haben es verwendet das Objekt ist immer noch da. Der garbage collector kann verschieben Sie das Objekt an einem anderen Ort zu jeder Zeit. Im Gegensatz zu .NET java nicht unterstützt memory pinning. Wenn Sie schauen, um push-Daten in eine Adresse aus native code eine DirectByteBuffer könnte das sein, was Sie brauchen.
Beiseite erwähnt, Unsicher was gut ist... nützlich (ich habe es mir in einer Produktionsumgebung).
Gibt es eine andere Lösung, die nicht wieder die Java-Adresse, die als native Zeiger es heißt direkte java.nio.ByteBuffer, es wurde mit genau dieser Idee im Hinterkopf.
Es allokierten Speichers durch direkte ByteBuffer ist nicht zugeordnet in den java-heap und es ist nicht Gegenstand des standard-garbage-collection. Dann, natürlich, ByteBuffer bietet den direkten Zeiger über ByteBuffer.Adresse()
Ihre Ziele, ich denke, dass die einzige Lösung ist JVMTI. Sie verbinden würde, eine eindeutige Kennung, die mit jedem Objekt mithilfe des {SetTag} Betrieb. Hören Sie dann {FieldModification} Ereignisse.