2009-04-21 9 views
21

In una terminologia di lay-man come funziona il meccanismo di garbage collection?Come funziona il meccanismo Garbage Collection?

Come viene identificato un oggetto disponibile per la garbage collection?

Inoltre, cosa significa Reference Counting, Mark and Sweep, Copying, Train in algoritmi GC?

+4

Nopes ... non è così. Probabilmente sembra proprio che l'ho messo in quel modo. In qualsiasi modo –

+1

Consiglierei di leggere la carta illustrata di 34 pagine, piuttosto buona, [* Uniprocessor Garbage Collection Techniques *, di Paul R. Wilson (1992)] (http://www.cse.nd.edu/~dthain /courses/cse40243/spring2006/gc-survey.pdf), che spiega i concetti alla base delle tecniche di raccolta dei rifiuti fondamentali (conteggio dei riferimenti, mark-and-sweep, mark-compact, incremental, generational). – stakx

risposta

29

Quando si utilizza una lingua con garbage collection non si accede direttamente alla memoria. Piuttosto, hai accesso a qualche astrazione su quei dati. Una delle cose che viene correttamente estratta è la posizione effettiva nella memoria del blocco di dati, nonché i puntatori ad altri datablock. Quando il garbage collector viene eseguito (ciò accade occasionalmente), controlla se mantieni ancora un riferimento a ciascuno dei blocchi di memoria che ha assegnato per te. Se non lo fai, libererà quella memoria.

La principale differenza tra i diversi tipi di garbage collector è la loro efficienza nonché eventuali limitazioni sul tipo di schemi di allocazione che possono gestire.

Il più semplice è il conteggio di riferimento corretto. Quando si crea un riferimento a un oggetto, un contatore interno su quell'oggetto viene incrementato, quando si ha la possibilità che il riferimento o non sia più nell'ambito, il contatore sull'oggetto (precedente) target viene decrementato. Quando questo contatore raggiunge lo zero, l'oggetto non viene più riferito e può essere liberato.

Il problema con il conteggio dei riferimenti dei garbage collector è che non possono gestire dati circolari. Se l'oggetto A ha un riferimento all'oggetto B e che a sua volta ha qualche riferimento (diretto o indiretto) all'oggetto A, non possono mai essere liberati, anche se nessuno degli oggetti nella catena è referenziato al di fuori della catena (e quindi non è t accessibile al programma).

L'algoritmo Segna e spaziatura invece può essere gestito da. L'algoritmo di mark and sweep funziona interrompendo periodicamente l'esecuzione del programma, contrassegnare ogni voce che il programma ha assegnato come irraggiungibile. Il programma esegue quindi tutte le variabili del programma e contrassegna ciò che indicano come raggiungibile. Se una di queste allocazioni contiene riferimenti ad altri dati nel programma, tali dati vengono quindi contrassegnati come raggiungibili, ecc.

Questa è la parte di contrassegno dell'algoritmo. A questo punto è possibile accedere a tutto il programma, indipendentemente da come indirettamente, contrassegnato come raggiungibile e tutto ciò che il programma non può raggiungere viene contrassegnato come irraggiungibile. Il garbage collector può ora recuperare in sicurezza la memoria associata agli oggetti contrassegnati come irraggiungibili.

Il problema con l'algoritmo di mark e sweep è che non è così efficiente - l'intero programma deve essere fermato per eseguirlo, e molti riferimenti all'oggetto non cambieranno.

Per migliorare questo, l'algoritmo di contrassegno e sweep può essere esteso con la cosiddetta "garbage collection generazionale". In questa modalità gli oggetti che sono stati nel sistema per un certo numero di raccolte di rifiuti sono promossi alla vecchia generazione, che non viene controllata spesso.

Questo migliora l'efficienza perché gli oggetti tendono a morire giovani (si pensi a una stringa che viene cambiata all'interno di un ciclo, con una durata forse di poche centinaia di cicli) o si vive molto a lungo (gli oggetti utilizzati per rappresentare la finestra principale di un applicazione, o la connessione al database di un servlet).

Informazioni molto più dettagliate possono essere trovate su wikipedia.

aggiunto basati su commenti:

Con il marchio e spazzare algoritmo (così come qualsiasi altro algoritmo di garbage collection, tranne il conteggio di riferimento) la raccolta dei rifiuti fare non corsa nel contesto del programma, dal momento che deve essere in grado di accedere a cose che il tuo programma non è in grado di accedere direttamente. Pertanto non è corretto dire che il garbage collector gira sullo stack.

+3

Chiaro, facile e breve. Una domanda qui a proposito di mark e sweep che controlla tutte le variabili del programma. Se non sono presenti riferimenti errati nello stack e oggetto nell'heap, come possiamo associare il processo GC all'esecuzione in Heap. –

3

La raccolta di dati inutili è semplicemente sapere se nel programma sono necessarie esigenze future e, in caso contrario, raccoglierle e eliminarle.

L'enfasi è sulla parola Garbage, qualcosa che è completamente utilizzato nella vostra casa viene gettato nella spazzatura e l'uomo spazzatura gestisce per voi venendo a prenderlo e portarlo via per dare più spazio nel cestino della tua casa

conteggio di riferimento, Mark e sweep, copia, treno ecc sono discussi in buono dettaglio in conteggio GC FAQ

4
  • Riferimento - Ogni oggetto ha un conteggio che viene incrementato quando qualcuno prende un riferimento oggetto e decrementato quando qualcuno rilascia il riferimento. Quando il conteggio dei riferimenti passa a zero, l'oggetto viene eliminato. COM utilizza questo approccio.
  • Segna e spazza - Ogni oggetto ha una bandiera se è in uso. Partendo dalla radice del grafo degli oggetti (variabili globali, persone locali su pile, ecc.) Ogni oggetto di riferimento ottiene il proprio flag impostato, e così via lungo la catena. Alla fine, tutti gli oggetti che non sono referenziati nel grafico vengono cancellati.

Il garbage collector per CLR è descritto in questo slidedeck. "Roots" sulla diapositiva 15 sono le fonti per gli oggetti che prima entrano nel grafico. I loro campi membri e così via sono usati per trovare gli altri oggetti nel grafico.

Wikipedia descrive molti di questi approcci in modo molto più dettagliato.

+0

Ho attraversato la wikipedia .. in realtà la cosa che mi infastidisce è il Object Graph come viene gestito e attraversato da una routine GC. –

+0

Aggiornato la mia risposta con vista 10k della costruzione del grafico dell'oggetto. – Michael

0

Il modo generale in cui viene eseguito è che il numero di riferimenti a un oggetto viene tenuto traccia dello sfondo e quando questo numero diventa zero, l'oggetto è SUBJECT TO garbage collection, tuttavia il GC non verrà attivato fino a quando non è esplicitamente necessario perché è un'operazione costosa. Quello che succede quando inizia è che il GC passa attraverso l'area di memoria gestita e trova ogni oggetto che non ha riferimenti. Il gc cancella quegli oggetti chiamando prima i loro distruttori, permettendo loro di ripulire se stessi, quindi libera la memoria. Generalmente, il GC compatterà l'area della memoria gestita spostando ogni oggetto sopravvissuto in un'area della memoria, consentendo di effettuare più allocazioni.

Come ho già detto, questo è un metodo che conosco e in questo campo si stanno facendo molte ricerche.

0

Garbage collection è un grande argomento e ci sono molti modi per implementarlo.

Ma per la più comune in poche parole, il garbage collector mantiene un record di tutti i riferimenti a qualunque cosa creata tramite l'operatore new, anche se l'uso che l'operatore era nascosta da voi (ad esempio, in un metodo Type.Create()). Ogni volta che aggiungi un nuovo riferimento all'oggetto, la radice di tale riferimento viene determinata e aggiunta all'elenco, se necessario. Un riferimento viene rimosso quando esce dall'ambito.

Quando non ci sono più riferimenti a un oggetto, esso può (non "volontà") essere raccolto. Per migliorare le prestazioni e assicurarsi che la pulizia necessaria sia eseguita correttamente, le raccolte vengono raggruppate in batch per più oggetti contemporaneamente e si verificano su più generazioni.