2010-03-12 20 views
11

Mi stavo chiedendo come il garbage collector in Java si occupa della seguente situazione.Come funziona Garbage Collection in Java?

oggetto A ha un riferimento all'oggetto B e oggetto B ha un riferimento all'oggetto C. Il programma principale ha un riferimento all'oggetto A. Quindi è possibile utilizzare l'oggetto B attraverso oggetto A, e Object C attraverso Object B tramite l'oggetto A.

Cosa succede all'oggetto B e all'oggetto C, se il collegamento tra l'oggetto A e l'oggetto B è impostato su null?

L'oggetto B e l'oggetto C ora sono stati raccolti dal Garbage Collector? Voglio dire c'è ancora una connessione tra l'oggetto B e l'oggetto C.

+0

Ho chiesto l'altra domanda in un altro post: http://stackoverflow.com/questions/2433261/how-does-garbage-collection-in-java-work-with-classes – JordyOnrust

risposta

9

L'oggetto B e l'oggetto C ora sono stati raccolti dal Garbage Collector?

Sì. Ebbene, essi sono candidati per la raccolta, perché non c'è modo di raggiungere l'oggetto B e C attraverso la radice che è A.

4

Non si può contare sul garbage collector per lavorare in un momento specifico, poiché il suo comportamento è imprevedibile, tutto quello che si può dire è che gli oggetti B e C sono ammissibili solo per la garbage collection

1

Penso che la logica sia diversa. Se l'oggetto non è accessibile da una discussione, può essere raccolto.

6

Sì, B e C sono idonei per la garbage collection, se non possono essere raggiunti da qualsiasi radice GC (le radici GC sono in genere tutte le discussioni e tutti i riferimenti nello stack).

+0

...e tutte le variabili statiche –

+3

@Maurice: non direttamente, per quanto ne so. le variabili statiche possono essere raggiunte tramite la 'Class' a cui appartengono, che può essere raggiunta tramite' ClassLoader' che le ha caricate, che può essere raggiunta tramite altre classi che è stata caricata e che possono essere raggiunte tramite oggetti di quel tipo. Quindi se 'ClassLoader' è GCed, puoi persino perdere il valore di una variabile statica. –

+0

Forse starai bene –

1

Se non v'è alcun riferimento di opporsi, allora sarà adatto per GC di procedere

2

In Infatti, la garbage collection in java è una cosa molto sofisticata, molto più che nell'interprete Ruby, ad esempio.

In ogni caso, la base teorica è la stessa.

Il GC identifica i grafici degli oggetti che non sono più raggiungibili dal codice del programma (vale a dire che non hanno più riferimento nel codice attivo). Quando si parla di oggetti grafici, parlo precisamente del grafico a oggetti B-> C. una volta irraggiungibile, può essere convertito in GC, ma non puoi dire quando sarà, a causa del GC che cerca di ottimizzare il più possibile il suo lavoro per evitare di rallentare l'applicazione.

2

B e C sono eleggibili per la garbage collection perché non è più possibile accedervi. Con l'imprevedibilità del garbage collector tutto ciò che sappiamo è che è probabile che vengano raccolti in futuro.

0

B non ha alcun riferimento ad esso in modo da essere prima garbage collection, quindi capirà che C non ha alcun riferimento ad esso, quindi C sarà garbage collection. È a scopo illustrativo, Jvm è abbastanza intelligente da raccoglierli in un'unica operazione.

+2

Non c'è modo di dire che B sarà gc per primo, cioè non si dovrebbe avere il codice del finalizzatore in B e C che dipende da tale ordine. Il GC non conta i riferimenti, ma controlla la raggiungibilità. Se non è possibile raggiungere sia B che C, sono ugualmente irraggiungibili. –

4

Come al solito, questo article è una lettura obbligata per chiunque voglia capire cosa fa la garbage collection. È ben scritto e ha disegni esplicativi.

+0

Aprendo il collegamento, ho bisogno di un nome utente e una password. – JordyOnrust

+0

Ah, l'FTP colpisce ancora. Ho modificato il mio post, con un altro link che dovrebbe funzionare meglio. C'è anche una versione PDF. –

+0

@ Bright010957: Tada! https://ritdml.rit.edu/dspace/bitstream/1850/5112/1/PWilsonProceedings1992.pdf –