2012-03-09 18 views
6

Attualmente sto creando un agente JVMTI nativo per Java 1.7. Il problema è che ho bisogno di indicizzare alcuni dati riguardanti specifiche istanze di oggetti Java. Quindi la mia domanda è: posso usare il valore del tipo di jobject come ID di istanza di un oggetto per recuperare i miei dati indicizzati?Come distinguere univocamente l'istanza dell'oggetto Java

Ho cercato qualsiasi informazione su quale sia la semantica del tipo di jobject. È un puntatore sulla posizione di memoria dell'oggetto? È un indirizzo puntatore stack? È un indirizzo per la struttura interna di una JVM? Quindi non riesco a capire se il valore di jobject è unico e immutabile lungo la vita dell'oggetto Java.

Grazie per il vostro aiuto.

modificare

Secondo le specifiche di JNI trovato here, jobject sembra essere un puntatore su un'istanza di oggetto.

+0

cosa hai fatto fino ad ora e qual è il tipo esatto di informazioni che stai cercando di ottenere e indicizzare o recuperare in base a ciò che hai ottenuto? –

+0

Potrebbe essere simile: http://stackoverflow.com/questions/909843/java-how-to-get-the-unique-id-of-an-object-which-overrides-hashcode –

+0

In realtà, la mia domanda riguarda un agente JVMTI scritto in C. Voglio usare l'istanza di Object come chiave primaria per lo scopo di caching (implementato come una mappa hash o un albero rosso-nero per esempio) Per ora sto taggando ogni oggetto con un ID univoco grazie a SetTag & Funzioni GetTag. – Gu0sur20

risposta

2

Quando si dice "valore del tipo di jobject", suppongo si intenda il valore restituito dallo toString. Se si guarda al doc java Essa afferma che:

Il metodo toString per la classe Object restituisce una stringa contenente il nome della classe di cui l'oggetto è un esempio, il carattere a-segno `@', e la rappresentazione esadecimale senza segno del codice hash dell'oggetto. In altre parole, questo metodo restituisce una stringa uguale al valore di:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

E se si guarda al doc Java per il metodo hashCode afferma:

Ogni volta che viene invocato su lo stesso oggetto più di una volta durante un'esecuzione di un'applicazione Java, il metodo hashCode deve restituire sempre lo stesso numero intero

e anche

Per quanto ragionevolmente pratico, il metodo hashCode definito dalla classe Object restituisce interi distinti per oggetti distinti. (Questo è in genere implementata convertendo l'indirizzo interno dell'oggetto in un intero, ma questa tecnica implementazione non è richiesto dal linguaggio di programmazione Java ™.)

Aggiornamento: Risposta al commento di Ryan: System.identityHashCode ti porterà l'originale codice hash anche se il metodo hashcode è sovrascritto. Tuttavia, come i commenti, non è davvero unico.

Quindi immagino che la risposta alle tue domande sia sì immutabile ed è molto probabile che sia unica, ma dovresti leggere i documenti o il codice sorgente per la tua JVM.

+0

HashCode è univoco per ogni oggetto. Tuttavia, si suppone che venga sovrascritto se si esegue l'override degli uguali, in modo tale che sia lo stesso di qualsiasi altro oggetto che è equivalente agli uguali. –

+3

@Ryan No certamente è ** non ** sempre unico. Chiaramente così: Avrai difficoltà a garantire un identificatore univoco utilizzando 32 bit su un sistema a 64 bit. – Voo

+0

Inoltre il contratto equals/hashcode dice che 2 oggetti uguali hanno lo stesso codice hash. Quindi se due oggetti erano semanticamente uguali, i loro hashcode dovrebbero essere gli stessi. Due oggetti non uguali possono avere lo stesso hashcode, quindi System.identityHashCode (o qualsiasi implementazione di hashcode) non può garantire univocità. –

1

Almeno in HotSpot, il jobject è effettivamente un puntatore a una posizione di un oggetto, ovvero il dereferenziamento ti darà un indirizzo che è univoco per ogni oggetto, che è la metà della "identità unica e immutabile" che tu chiedi di. Il problema è che l'indirizzo può cambiare durante la garbage collection, poiché HotSpot può spostare gli oggetti.

Le funzioni GetTag e SetTag JVMTI utilizzano internamente una tabella hash dalla posizione dell'oggetto al tag.HotSpot aggiorna questa tabella hash ogni volta che gli oggetti vengono spostati, cosa che non è possibile replicare facilmente dalla posizione di un agente JVMTI. Assegnare i propri valori di identità unici con i tag, come dici tu stai già facendo, è probabilmente l'unico modo per andare qui.