2013-05-31 6 views
7

Ciò che sto chiedendo potrebbe essere una domanda stupida, quindi scusatemi per quello. così si va in questo modo:Questo oggetto java è idoneo per la garbage collection in List

List<Boss> bossList = new ArrayList<Boss>(); 
Boss b = null; 
for(Employee e : List<Employee> myList){ 
    b = new Boss(); 
    b.setEmployee(e); 
    bossList.add(b); 
    b = null; 
} 

Quindi, in scenario di cui sopra, sto creando molti oggetti Boss e poi de-referenziamento li (lo so non ho bisogno di scrivere "b = null", ma io lo ha fatto per chiarezza della mia domanda). Nello scenario normale, li avrei marcati alla garbage collection, facendo questo, ma perché in questo scenario, sto aggiungendo quegli oggetti Boss nella collezione List, sono contrassegnati per GC o no? Se no, allora perché? E in che modo la raccolta di elenchi funziona internamente per contenere i riferimenti per ciascun oggetto aggiunto, in modo da evitare la garbage collection?

[EDIT] 

La portata della domanda è limitata solo ai singoli oggetti Boss creati in for ciclo, se si considera che questo metodo restituisce il riferimento della lista con il mondo esterno.

+0

L'oggetto stesso, che viene inserito nell'elenco, non è ovviamente disponibile per GC poiché esiste ancora un riferimento ad esso, anche se annulli 'b'. – NilsH

+0

Un oggetto non può essere garbage collector se esiste un modo nello stato corrente del programma per essere raggiunto (escluso tramite la classe speciale WeakReference e le sue classi correlate). Un riferimento, non importa dove, dal codice in tempo reale è sufficiente. – Patashu

risposta

5

ArrayList ha Object[] elementData internamente. Quando hai aggiunto b a bossList ArrayList assegnato elementData[0] = b. Pertanto, quando hai assegnato null a l'istanza di Boss viene ancora referenziata da elementData[0] e non può essere sottoposta a GC. Tuttavia, dal momento che l'istanza ArrayList fa riferimento solo alla variabile del metodo dopo che il metodo restituisce entrambe le istanze ArrayList e Boss saranno idonee per GC.

9

Gli oggetti Boss non verranno raccolti dallo GarbageCollector perché sono ancora referenziati nel blocco di codice che è stato pubblicato. bossList è un ArrayList che dispone di un array interno di Object che contiene quindi riferimenti a quegli oggetti che vengono aggiunti ad esso.

In questa situazione non vengono considerati solo i riferimenti da te, ma tutti i riferimenti a tutti gli oggetti coinvolti.

EDIT: Dal momento che si restituisce l'elenco nel codice gli oggetti non saranno contrassegnate per la raccolta dei rifiuti fino a che la lista non è più viene fatto riferimento nel programma.

+0

Ma poiché "l'elenco " è dichiarato all'interno del metodo, al termine del metodo, l'elenco verrà contrassegnato per GC, quindi anche i riferimenti all'oggetto "Boss" verranno contrassegnati. –

+0

corretto. Non appena il blocco in cui viene dichiarata la 'ArrayList' viene terminato, tutti gli oggetti verranno raccolti (se non ulteriormente referenziati). –

+0

Certo, se stai assumendo che l'elenco esiste solo all'interno del metodo. – NilsH

3

Ecco ciò che realmente accade con il tuo codice:

Hello

-1

Poiché Java è passaggio per riferimento, ogni volta che si aggiunge b-bossList, bossList inizia fanno riferimento alla posizione di memoria che B sta puntando. Quindi, quando b viene annullato solo il collegamento da b al riferimento è rotto. Così mantenendo l'oggetto accessibile attraverso bossList.