2013-07-06 12 views
9

Supponiamo che ci sia un oggetto a di classe A, che contiene un riferimento a un altro oggetto b di classe B. E questo è l'unico riferimento a b. Così ora, se tutti i riferimenti a a vengono rimossi, a è pronto per GC. Questo significa che b è anche pronto per raccogliere i rifiuti? perché, sebbene b abbia un riferimento (dentro a), è irraggiungibile, perché a è irraggiungibile.È un oggetto inutile se viene fatto riferimento solo da dati inutili?

Quindi, come funziona esattamente questo scenario? Intendo l'ordine della raccolta dei rifiuti.

+0

possibile duplicato del [Garbage Collection in Java e riferimenti circolari] (http://stackoverflow.com/questions/1910194/garbage-collection-in-java-and -circolare-riferimenti) – delnan

+1

E 'meglio pensare al netturbino che capisce cosa ** non è ** eleggibile per la raccolta dei rifiuti e raccoglie il resto. Se può essere visto dalla radice allora non è eleggibile –

risposta

13

Una volta che un oggetto non è raggiungibile da una radice, verrà raccolto. Vedi this question per una spiegazione delle radici di GC.

Verranno raccolti interi sottografi (come si descrive) presumendo che non sia possibile raggiungere alcun nodo all'interno di tale sottografo.

Java (e .NET) utilizzare contrassegnare e spazzare la raccolta di dati inutili che si occupa di questo tipo di problema.

I sistemi basati su conteggio di riferimento (come C++ std::shared_ptr<T>) potrebbero non funzionare nel caso di dipendenze circolari che rimangono irraggiungibili. Questo non è un problema per GC Java/.NET.

+0

+1 Non vedo alcun motivo per un voto negativo qui. –

+3

Se c'è un downvoter che downvotes senza motivo, allora ci sono altre persone come me che invitano per una buona risposta :) –

1

Java GC è abbastanza intelligente da raccogliere isole di oggetti isolati anche se potrebbero indicarsi l'un l'altro. Quindi, b diventa idoneo per la garbage collection. Il punto da notare qui è che sebbene tu abbia un riferimento a b non è dal vivo nel senso che non può essere raggiunto dalla radice del tuo programma.

+1

Questo buono oppure un riferimento circolare (A ha un riferimento a B e B a A) non potrebbe mai essere raccolto ma potrebbe anche essere irraggiungibile –

+0

Perché il voto negativo? –

+0

Sembra che i somesones abbiano votato molte delle buone risposte in questa domanda. Alcune persone sono proprio così –

0

Dipende dal GC. A JVM può essere detto di usare diversi GC e tipicamente usa 3 GC come uno (eden, copia, markcompact).

In ogni tipica GC e nel conteggio dei riferimenti alla situazione si descritto è gestito in modo pulito, entrambi objs sono raccolti. Pensaci in 2 fasi: prima "a" viene notato e raccolto, quindi "b" viene notato e raccolto. Ancora: il modo specifico di notare dipende dal GC.

+0

È mia esperienza che il refcounting fallisce se si hanno riferimenti circolari.Cioè, se A-> B e B-> A, entrambi hanno un conteggio di uno, eppure nessuno dei due è raggiungibile. –

+2

Non c'è alcun riferimento da "b" a "a" in ciò che l'OP ha descritto. –

+0

Vero, ma se non sbaglio la tua risposta non ha preso quell'enfasi prima della modifica. In ogni caso, GC è un argomento enorme che OP è apparentemente nuovo e potremmo allontanarci dagli aspetti introduttivi :) –

-1

Questo è esattamente il punto di GC. Dal momento che b non è raggiungibile dal thread principale, sarà garbage collection. Non è solo il conteggio che conta.

Problemi correlati