JavaRush /Java Blog /Random-IT /Maggiori informazioni sul garbage collector in Java

Maggiori informazioni sul garbage collector in Java

Pubblicato nel gruppo Random-IT
Ciao! Nell'ultima lezione, abbiamo conosciuto per la prima volta il meccanismo integrato del linguaggio Java: il garbage collector. Funziona in background mentre il programma è in esecuzione, raccogliendo oggetti divenuti non necessari, che verranno successivamente eliminati. In questo modo si libera memoria per creare nuovi oggetti in futuro. In questa lezione daremo uno sguardo più da vicino al principio del suo funzionamento. Ad esempio, come e quando un oggetto diventa superfluo? E come fa il garbage collector a saperlo? Risponderemo a queste domande :) La nostra lezione è più una panoramica: non è necessario memorizzare questo materiale. Ha lo scopo di ampliare i tuoi orizzonti riguardo al lavoro della memoria e al garbage collector, quindi basterà leggerlo e imparare 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 ne fa parte e funziona a parte: per descriverlo, nell'ultima lezione abbiamo fatto un'analogia con un robot aspirapolvere. In realtà, non è sempre stato così. In precedenza, il Garbage Collector era progettato in modo tale da funzionare nello stesso thread del programma. E secondo un programma, una volta ogni pochi minuti, iniziava a verificare la presenza di oggetti non necessari nel programma. Il problema era che durante questo controllo e la garbage collection, il programma si bloccava e non veniva eseguito. Immagina di essere seduto in un ufficio a lavorare. Ma poi arriva una donna delle pulizie e deve lavare i pavimenti della stanza. Ti butta fuori dal computer per 5 minuti e tu aspetti che finisca di pulire. Durante questo periodo non puoi lavorare. Questo è più o meno il modo in cui funzionavano i garbage collector :) Successivamente, questo meccanismo è stato modificato e ora il garbage collector funziona in background, senza rallentare il lavoro del programma stesso. Sai già che un oggetto muore quando non rimangono più riferimenti ad esso. Ma il garbage collector in realtà non conta i riferimenti a . Innanzitutto, può essere piuttosto lungo. In secondo luogo, non è molto efficace. Dopotutto, gli oggetti possono riferirsi l'uno all'altro! Maggiori informazioni sul garbage collector - 2La figura mostra un esempio in cui 3 oggetti fanno riferimento tra loro, ma nessun altro fa riferimento a loro. Cioè, non sono necessari affinché il resto del programma funzioni. Se il garbage collector contasse semplicemente i riferimenti, tutti questi 3 oggetti rimarrebbero e non libererebbero memoria: ci sono dei riferimenti ad essi! Può essere paragonato ad un'astronave. Durante il volo, gli astronauti hanno deciso di controllare l'elenco dei pezzi di ricambio per le riparazioni e hanno trovato tra questi un volante e pedali di un'auto normale. Chiaramente non sono necessari qui e occupano spazio extra. Sebbene queste parti siano collegate e abbiano alcune funzioni, nell'ambito del funzionamento del veicolo spaziale sono spazzatura inutile, di cui è meglio sbarazzarsi. Pertanto, Java ha deciso di creare le basi per la garbage collection non contando i riferimenti, ma dividendo gli oggetti in due tipi: raggiungibili e irraggiungibili.. Come determinare se un oggetto è raggiungibile? Tutto ciò che è geniale è semplice. Un oggetto è raggiungibile se fa riferimento a un altro oggetto raggiungibile. Ciò si traduce in una “catena di raggiungibilità”. Inizia all'avvio del programma e prosegue per tutta la durata del suo funzionamento. Assomiglia a questo: Maggiori informazioni sul garbage collector - 4La freccia nella figura indica il codice di esecuzione del nostro programma. Nel codice, ad esempio nel metodo main(), vengono creati riferimenti agli oggetti. Questi oggetti possono riferirsi a nuovi oggetti, quelli ad altri ancora, e così via. Si forma una catena di collegamenti di oggetti . Se un oggetto può essere raggiunto attraverso questa catena di collegamenti a un "collegamento radice", cioè creato direttamente nel codice di esecuzione, è considerato raggiungibile. Nella nostra immagine sono indicati in blu. Ma se l'oggetto è uscito da questa catena, cioè nessuna delle variabili nel codice attualmente eseguito contiene riferimenti ad esso, ed è anche impossibile raggiungerlo attraverso la “catena di collegamenti” - è considerato irraggiungibile. Nel nostro programma due di questi oggetti sono indicati in rosso. Nota: questi oggetti “rossi” sono collegati tra loro. Ma, come abbiamo detto prima, il moderno garbage collector in Java non esegue il conteggio dei riferimenti. Determina se un oggetto è raggiungibile o irraggiungibile . Pertanto, i due oggetti rossi nella foto diventeranno la sua preda. Ora diamo un'occhiata all'intero processo dall'inizio alla fine e allo stesso tempo vediamo come funziona la memoria in Java :) Tutti gli oggetti in Java sono archiviati in un'area di memoria speciale chiamata heap . Nel linguaggio comune, un “mucchio” è una montagna di oggetti dove tutto giace in disordine. Ma l'heap in Java non è così. Ha una struttura molto logica e ragionevole. Un bel giorno, i programmatori Java scoprirono che tutti gli oggetti nei loro programmi possono essere divisi in due tipi: oggetti relativamente semplici e oggetti "di lunga durata" . Gli oggetti “longevi” sono quelli che sono sopravvissuti a molte raccolte di rifiuti. Molto spesso esisteranno fino alla fine del programma. Di conseguenza, l'heap comune, in cui sono archiviati tutti gli oggetti creati, è stato diviso in più parti. La prima parte ha un bellissimo nome: Eden (il biblico "Giardino dell'Eden"). Questo è un nome fantastico perché è qui che vanno gli oggetti dopo che sono stati creati. È in questa parte che viene allocata la memoria per i nuovi oggetti quando scriviamonew. Si possono creare moltissimi oggetti e quando lo spazio in quest'area finisce, inizia la prima, “veloce” garbage collection. Va detto che il garbage collector è molto intelligente e sceglie un algoritmo di lavoro a seconda di cosa c'è di più nell'heap: spazzatura o oggetti funzionanti. Se quasi tutti gli oggetti sono spazzatura, il raccoglitore contrassegna gli oggetti “vivi” e li sposta in un'altra area di memoria, dopodiché l'area corrente viene completamente ripulita. Se i rifiuti sono pochi e la maggior parte è occupata da oggetti viventi, contrassegna i rifiuti, li pulisce e sistema gli oggetti rimanenti. Abbiamo detto “il collezionista segna gli oggetti “vivi” e li sposta in un'altra locazione di memoria”, ma quale? L'area di memoria in cui vengono trasferiti tutti gli oggetti che sopravvivono ad almeno una garbage collection è chiamata Survival Space . Survival Space, a sua volta, è diviso in generazioni . A ogni oggetto viene assegnata una generazione in base al numero di garbage collection che ha subito. Se ce n'è uno, appartiene alla “Generazione 1”, se 5 – alla “Generazione 5”. Insieme, Eden e Survival Space formano un'area chiamata Young Generation . Oltre a Young Generation, nell'heap c'è un'altra area di memoria: Old Generation ("vecchia generazione"). Questi sono gli oggetti molto longevi sopravvissuti a molte raccolte di rifiuti. È più redditizio conservarli separatamente da tutti gli altri. E solo quando l’area Old Generation sarà piena, cioè Anche se nel programma sono presenti così tanti oggetti di lunga durata che non c'è memoria sufficiente, viene eseguita una raccolta dei rifiuti completa. Elabora non solo un'area di memoria, ma generalmente tutti gli oggetti creati dalla macchina Java. Naturalmente ci vuole molto più tempo e risorse. Ecco perché si è deciso di conservare separatamente gli oggetti longevi. Quando lo spazio in altre aree finisce, viene effettuata la cosiddetta “raccolta rapida dei rifiuti”. Copre solo un'area e per questo è più economico e veloce. Alla fine, quando anche l'area dei centenari è già intasata, entra in gioco la pulizia totale. Così, lo strumento più “pesante” viene utilizzato dall’assemblatore solo quando non è più necessario. Schematicamente, la struttura dell'heap e della pulizia si presenta così: Maggiori informazioni sul garbage collector - 5
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION