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.
Nopes ... non è così. Probabilmente sembra proprio che l'ho messo in quel modo. In qualsiasi modo –
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