CodeGym /Java Blog /Random-IT /Maggiori informazioni sul raccoglitore di rifiuti
John Squirrels
Livello 41
San Francisco

Maggiori informazioni sul raccoglitore di rifiuti

Pubblicato nel gruppo Random-IT
CIAO! Nell'ultima lezione, abbiamo prima conosciuto il garbage collector integrato di Java e ci siamo fatti un'idea approssimativa di come funziona. Funziona in background mentre il programma è in esecuzione, raccogliendo oggetti non necessari che verranno eliminati in seguito. Pertanto, libera memoria che può essere utilizzata per creare nuovi oggetti in futuro.
Maggiori informazioni sul Garbage Collector - 1
In questa lezione, discuteremo più in dettaglio come funziona. Ad esempio, come e quando un oggetto diventa superfluo? E come lo scopre il netturbino? Queste sono domande a cui risponderemo durante la lezione di oggi :) La lezione sarà più simile a una panoramica: non è necessario imparare questo materiale a memoria. L'intenzione è principalmente quella di espandere la tua visione su come funzionano la memoria e il garbage collector, quindi leggi e trova qualcosa di nuovo per te stesso :) Andiamo! La prima cosa che devi ricordare è che il Garbage Collector funziona in parallelo con il tuo programma. Non fa parte del tuo programma. Funziona separatamente (nell'ultima lezione l'abbiamo paragonato a un robot aspirapolvere) Ma non è sempre stato così. La raccolta dei dati inutili veniva eseguita sullo stesso thread del programma. In alcuni orari (una volta ogni pochi minuti), il Garbage Collector controlla la presenza di oggetti indesiderati nel programma. Il problema era che il programma si bloccava (non eseguiva) durante questo controllo e Garbage Collection. Immagina di essere seduto nel tuo ufficio al lavoro. Ma poi entra la donna delle pulizie per lavare i pavimenti. Ti allontana dal tuo computer per 5 minuti e tu aspetti che abbia finito di pulire. Durante questo periodo, non sei in grado di lavorare. Ecco come funzionava la raccolta dei rifiuti :) Questo meccanismo è stato successivamente modificato e ora il raccoglitore di rifiuti viene eseguito in background, non ostacolare il lavoro del programma stesso. Sai già che un oggetto muore quando non ha più riferimenti. In realtà,il Garbage Collector non conta i riferimenti agli oggetti . Innanzitutto, questo potrebbe richiedere molto tempo. In secondo luogo, non è molto efficace. Dopo tutto, gli oggetti possono riferirsi l'uno all'altro! Maggiori informazioni sul netturbino - 2La figura mostra un esempio in cui 3 oggetti si riferiscono l'uno all'altro, ma nessun altro si riferisce ad essi. In altre parole, il resto del programma non ne ha bisogno. Se il Garbage Collector contasse semplicemente i riferimenti, questi 3 oggetti non verrebbero raccolti e la memoria non verrebbe liberata (ci sono riferimenti a loro!). Possiamo paragonarlo a un'astronave. Durante il volo, gli astronauti decidono di controllare l'elenco dei pezzi di ricambio disponibili per le riparazioni. Tra le altre cose, trovano un volante e pedali da un'auto normale. Ovviamente, qui non servono e occupano spazio inutilmente (sebbene queste due parti siano correlate tra loro e abbiano alcune funzioni). Ma all'interno della navicella, sono spazzatura inutile che dovrebbe essere scartata. Di conseguenza, in Java, è stata presa la decisione di raccogliere i rifiuti non basandosi sul conteggio dei riferimenti,raggiungibile e irraggiungibile . Come determiniamo se un oggetto è raggiungibile? È tutto semplicemente geniale. Un oggetto è raggiungibile se vi fa riferimento un altro oggetto raggiungibile. Quindi, otteniamo una "catena di raggiungibilità". Inizia all'avvio del programma e continua per tutta la durata del programma. Assomiglia a questo: Maggiori informazioni sul netturbino - 3 La freccia nella figura indica il codice eseguibile del nostro programma. Il codice (ad esempio, il main()metodo) crea riferimenti agli oggetti. Questi oggetti possono riferirsi ad altri oggetti, quegli oggetti ad altri ancora e così via. Questo forma una catena di riferimento. Se puoi tracciare una catena da un oggetto al "riferimento root" (quello creato direttamente nel codice eseguibile), allora è considerato raggiungibile. Tali oggetti sono contrassegnati in nero nell'immagine. Ma un oggetto è irraggiungibile se l'oggetto esce da questa catena, cioè nessuna delle variabili nel codice attualmente in esecuzione fa riferimento ad esso, e non può essere raggiunto attraverso la "catena di riferimento". Nel nostro programma, due di questi oggetti sono contrassegnati in rosso. Si noti che questi oggetti "rossi" hanno riferimenti l'uno all'altro. Ma come abbiamo detto prima, il moderno garbage collector di Java non conta i riferimenti. Determina se un oggetto è raggiungibile o irraggiungibile. Di conseguenza, si impadronirà dei due oggetti rossi nella figura. Ora diamo un'occhiata all'intero processo dall'inizio alla fine. In tal modo, vedremo anche come è organizzata la memoria in Java :) Tutti gli oggetti Java sono archiviati in un'area speciale di memoria chiamata heap . Nel linguaggio quotidiano, un mucchio è di solito una montagna di oggetti, dove tutto è mescolato. Ma non è quello che è l'heap in Java. La sua struttura è molto logica e ragionevole. Ad un certo punto, i programmatori Java hanno scoperto che tutti i loro oggetti potevano essere divisi in due tipi: oggetti semplici e "oggetti longevi". Gli "oggetti di lunga durata" sono oggetti che sono sopravvissuti a molti cicli di raccolta dei rifiuti. Di solito vivono fino alla fine del programma. Alla fine, l'heap completo, in cui sono archiviati tutti gli oggetti, è stato diviso in più parti. La prima parte ha un nome bellissimo: eden(dal biblico "Giardino dell'Eden"). Questo nome è appropriato, perché è qui che gli oggetti finiscono dopo essere stati creati. Questa è la parte della memoria in cui vengono creati nuovi oggetti quando usiamo la parola chiave new. Possono essere creati molti oggetti. Quando quest'area esaurisce lo spazio, inizia una raccolta dei rifiuti "veloce" iniziale. Dobbiamo dire che il netturbino è molto intelligente. Sceglie un algoritmo in base al fatto che l'heap abbia più spazzatura o più oggetti attivi. Se quasi tutti gli oggetti sono spazzatura, il raccoglitore contrassegna gli oggetti attivi e li sposta in un'altra area della memoria. Quindi l'area corrente è completamente cancellata. Se non c'è molta immondizia e l'heap è composto principalmente da oggetti attivi, il raccoglitore contrassegna l'immondizia, la cancella e impacchetta insieme gli altri oggetti. Abbiamo detto "uno spazio di sopravvivenza . Uno spazio di sopravvivenza , a sua volta, è suddiviso in generazioni . Ogni oggetto appartiene a una particolare generazione, a seconda di quanti cicli di raccolta dei rifiuti è sopravvissuto. Se un oggetto è sopravvissuto a un round di Garbage Collection, allora è in "Generazione 1"; se 5, allora "Generazione 5". Insieme, l'eden e uno spazio di sopravvivenza formano un'area chiamata la giovane generazione . Oltre alla giovane generazione, l'heap ha un'altra area di memoria chiamata vecchia generazione. Questa è precisamente l'area in cui finiscono gli oggetti longevi che sono sopravvissuti a molti giri di raccolta dei rifiuti. Ci sono vantaggi nel tenerli separati da tutti gli altri. La raccolta completa dei rifiuti viene eseguita solo quando la vecchia generazione è piena, ovvero ci sono così tanti oggetti di lunga durata nel programma che non c'è memoria sufficiente. Questo processo coinvolge più di un'area di memoria. In generale coinvolge tutti gli oggetti creati dalla macchina Java. Naturalmente, questo richiede molto più tempo e risorse. Proprio per questo è stata presa la decisione di conservare separatamente gli oggetti longevi. La "raccolta rapida dei rifiuti" viene eseguita quando altre aree esauriscono lo spazio. Ciò coinvolge solo un'area, il che lo rende più veloce ed efficiente. Infine, quando anche l'area per gli oggetti longevi è completamente riempita, viene attivata la raccolta completa dei rifiuti. Pertanto, il collezionista utilizza lo strumento "più pesante" solo quando è impossibile evitarlo. Ecco una rappresentazione visiva della struttura dell'heap e della raccolta dei rifiuti: Maggiori informazioni sul netturbino - 4
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION