2013-11-27 9 views
8

L'indirizzo di un oggetto è costante durante il suo ciclo di vita o può cambiare? Ho solo pensato che l'indirizzo di un oggetto non cambia mai. È JVM dipendente? Non ho trovato alcuna specifica chiara.L'indirizzo di un oggetto è stato corretto durante il suo ciclo di vita?

+0

sua JVM interno, perché l'indirizzo negozio JVM di riferimento nelle variabili locali, collezionisti JVM immondizia svolge ruolo dopo oggetto e riferimento creazione che oggetto è in uso, invisibile o non raggiungibile –

risposta

5

L'indirizzo di un oggetto in java non è fisso; piuttosto, può cambiare (soggetto a condizioni).

Questo perché normalmente gli oggetti sono allocati nello spazio eden. Quindi si spostano nello spazio dei sopravvissuti, quindi anche nello spazio di vecchia generazione se sopravvivono a cicli di raccolta dei rifiuti. Quindi cambia. Ma se l'oggetto è allocato nello spazio eden e anche i rifiuti raccolti restano nello stesso spazio, l'indirizzo non cambierà. Allo stesso modo se l'oggetto è troppo grande per essere allocato nello spazio eden, allora la JVM alloca l'oggetto nella vecchia generazione e se è garbage collocato rimanendo dove è stato allocato, anche l'indirizzo non cambia.

Un'altra cosa che dovresti sapere che anche se un oggetto rimane in una generazione, se si tratta di garbage collection rimanendo nella stessa generazione, l'indirizzo potrebbe cambiare, perché potrebbe essere stato spostato dal garbage collector mentre faceva la garbage collection , per esempio dallo spazio di eden a sopravvissuto, sopravvissuto a sopravvissuto o persino alla vecchia generazione in caso di compattazione.

Dalle condizioni precedenti è chiaro che lo spostamento di un indirizzo dipende da JVM.

Spero che aiuti.

EDIT

Rispondendo alla domanda qui sotto:

se creo un nuovo oggetto e riporlo in una mappa, dove viene immagazzinato sulla base di hashCode (che viene generato utilizzando la memoria dell'oggetto posizione come per java). Ora l'indirizzo dell'oggetto è cambiato (risultante in un diverso hashCode), quindi come da risposta, il codice non può mai recuperare l'oggetto dalla mappa ??

hashCodes vengono salvati nell'intestazione dell'oggetto da JVM. Quindi è costante. Durante la creazione di un object viene assegnato a 1 per impostazione predefinita, ma quando si utilizza l'oggetto per la prima volta viene calcolato e viene memorizzato nell'intestazione. Non cambia mai per tutta la durata dello Object.

+2

La risposta sembra essere corretta.Ho solo un dubbio, se creo un nuovo oggetto e lo memorizzo in una mappa, dove viene memorizzato in base a hashCode (che viene generato utilizzando la posizione di memoria dell'oggetto come per java). Ora l'indirizzo dell'oggetto è cambiato (risultante in un diverso hashCode), così come per la risposta, il codice non può mai recuperare l'oggetto dalla mappa ?? – dharam

+0

@dharam si prega di vedere la mia modifica. – Trying

1

Non in generale. Molti garbage collector della JVM spostano gli oggetti e la lingua non fornisce garanzie sulla posizione dell'oggetto.

Ci sono alcuni GC (plain Mark & Sweep, ad esempio) che non lo fanno; è possibile utilizzare una JVM specializzata che supporta questi (ad esempio una build personalizzata di Jikes RVM) se si richiede questa funzionalità.

Si noti che ogni oggetto può ancora contenere un ID (soprattutto) univoco (almeno nelle JVM che ho visto), in parte per supportare un'implementazione di base di hashcode.

Problemi correlati