2011-01-10 4 views
5

Diciamo che ho questa variabile:è possibile ottenere l'indirizzo su heap di una variabile in java?

... 
Somekindofobject var = new Somekindofobject(); 
... 

e voglio sapere dove var si trova sul mucchio (per indirizzo, come 0x08 e così via), e per stampare l'indirizzo fuori.

è possibile?

+0

Se tutto ciò che si vuole fare è stampare l'oggetto, quale beneficio si ottiene dal sapere dove si trova nell'heap? Cosa stai cercando di realizzare davvero? – Anon

+0

@Anon: Penso che voglia dire stampare l'indirizzo. –

+0

sto lavorando su un programma che riceve come input il programma java e il codice degli strumenti che viene stampato per archiviare le informazioni sull'accesso variabile. L'unico modo per determinare tra due campi di oggetti della stessa classe è il loro indirizzo in heap. Pertanto, ho bisogno dell'indirizzo sull'heap – RanZilber

risposta

8

Sto lavorando su un programma che ottiene come programma Java di ingresso, e strumenti codice che stampa su file informazioni sull'accesso variabili. L' solo modo che io possa determinare tra due campi di oggetti della stessa classe è dal loro indirizzo su heap. Pertanto, ho bisogno l'indirizzo sul mucchio

È possibile utilizzare System.identityHashCode per ottenere una nozione di identità. Non è perfetto, ma è abbastanza buono. Se si ottiene l'indirizzo heap di un oggetto, ricordare che la JVM è autorizzata a spostare gli oggetti (e spesso quando un garbage collector generazionale promuove un oggetto longevo a una generazione precedente), quindi la posizione heap di un oggetto non è un buon proxy per l'identità in tutte le circostanze.

+0

questo probabilmente risolverebbe il problema dell'OP molto bene su sistemi a 32 bit. – irreputable

+0

System.identityHashCode è attualmente basato su un generatore casuale con seme di thread – bestsss

+0

che è possibile elaborare? cosa mi dà System.idenetityHashCode (var)? Ho bisogno di qualcosa che mi permetta di determinare tra lo stesso campo su un oggetto diverso di una stessa classe. – RanZilber

3

si potrebbe dare una prova su questo articolo di javaPaper: Address of a Java object

Si tratta di utilizzare la classe Unsafe nel pacchetto sun.misc per ottenere l'indirizzo.

+0

Assolutamente spaventoso. Nota * Non sicuro * (il nome è stato scelto per un motivo) e * sun.misc * (un pacchetto specifico dell'implementazione "privato"). Si noti inoltre che questo è per l'indirizzo * logico e non per l'indirizzo * fisico *. +1 per un articolo interessante. –

+0

+1 per Non sicuro, va bene. – bestsss

+1

Questo ti darà l'indirizzo dei campi all'interno di un oggetto, ma non l'oggetto stesso. –

1

Anche se si è riusciti a ottenere l'indirizzo heap dell'oggetto non è possibile garantire che, al momento in cui lo si è utilizzato, l'oggetto sia ancora lì. Il garbage collector può spostare l'oggetto in un'altra posizione in qualsiasi momento. A differenza di .NET, Java non supporta il blocco della memoria. Se stai cercando di inserire dati in un indirizzo dal codice nativo, un DirectByteBuffer potrebbe essere quello di cui hai bisogno.

1

A parte menzionato non sicuro che è utile ... (l'ho usato io stesso in un ambiente di produzione). C'è un'altra soluzione che non restituirà l'indirizzo Java come puntatore nativo chiamato java.nio.ByteBuffer diretto, è stato progettato pensando esattamente a questa idea. La memoria allocata da ByteBuffer diretto non è allocata nell'heap java e non è oggetto della garbage collection standard. Quindi, naturalmente, ByteBuffer offre il puntatore diretto tramite ByteBuffer.address()

+0

non è quello che mi serve qui, perché non ho idea del codice di input. Ma mi piace questa idea, quindi +1; – RanZilber

0

Dati i tuoi obiettivi, penso che l'unica soluzione sia JVMTI. Associare un identificativo univoco a ciascun oggetto utilizzando l'operazione {SetTag}. Quindi ascolta gli eventi {FieldModification}.

Problemi correlati