.NET Core - Garbage Collection

In questo capitolo tratteremo il concetto di Garbage collection, che è una delle caratteristiche più importanti della piattaforma di codice gestito .NET. Il Garbage Collector (GC) gestisce l'allocazione e il rilascio della memoria. Il garbage collector funge da gestore automatico della memoria.

  • Non è necessario sapere come allocare e rilasciare memoria o gestire la durata degli oggetti che utilizzano quella memoria

  • Viene effettuata un'allocazione ogni volta che si dichiara un oggetto con una parola chiave "nuova" o un tipo di valore è boxed. Le allocazioni sono in genere molto veloci

  • Quando la memoria non è sufficiente per allocare un oggetto, il GC deve raccogliere ed eliminare la memoria inutile per rendere disponibile la memoria per nuove allocazioni.

  • Questo processo è noto come garbage collection.

Vantaggi della raccolta dei rifiuti

Garbage Collection offre i seguenti vantaggi:

  • Non è necessario liberare memoria manualmente durante lo sviluppo dell'applicazione.

  • Alloca anche gli oggetti nell'heap gestito in modo efficiente.

  • Quando gli oggetti non vengono più utilizzati, recupererà quegli oggetti cancellando la loro memoria e manterrà la memoria disponibile per allocazioni future.

  • Gli oggetti gestiti ottengono automaticamente contenuto pulito per iniziare, quindi i loro costruttori non devono inizializzare ogni campo dati.

  • Fornisce inoltre la sicurezza della memoria assicurandosi che un oggetto non possa utilizzare il contenuto di un altro oggetto.

Condizioni per la raccolta dei rifiuti

La raccolta dei dati inutili si verifica quando si verifica una delle seguenti condizioni.

  • Il sistema ha poca memoria fisica.

  • La memoria utilizzata dagli oggetti allocati nell'heap gestito supera una soglia accettabile. Questa soglia viene regolata continuamente durante l'esecuzione del processo.

  • Il GC.Collectviene chiamato il metodo e in quasi tutti i casi non è necessario chiamare questo metodo, perché il garbage collector viene eseguito continuamente. Questo metodo viene utilizzato principalmente per situazioni e test unici.

Generazioni

.NET Garbage Collector ha 3 generazioni e ogni generazione ha il proprio heap che viene utilizzato per l'archiviazione degli oggetti allocati. C'è un principio di base secondo cui la maggior parte degli oggetti è di breve o lunga durata.

Prima generazione (0)

  • Nella generazione 0, gli oggetti vengono prima allocati.

  • In questa generazione, gli oggetti spesso non vivono oltre la prima generazione, poiché non sono più in uso (fuori ambito) nel momento in cui si verifica la successiva Garbage Collection.

  • La generazione 0 è veloce da raccogliere perché l'heap associato è piccolo.

Seconda generazione (1)

  • Nella prima generazione, gli oggetti hanno uno spazio della seconda possibilità.

  • Gli oggetti di breve durata ma che sopravvivono alla raccolta della generazione 0 (spesso basata su tempi casuali) passano alla generazione 1.

  • Anche le raccolte di prima generazione sono veloci perché anche l'heap associato è piccolo.

  • I primi due heap rimangono piccoli perché gli oggetti vengono raccolti o promossi all'heap di generazione successiva.

Terza generazione (2)

  • Nella seconda generazione, tutti gli oggetti lunghi sono vissuti e il suo mucchio può diventare molto grande.

  • Gli oggetti di questa generazione possono sopravvivere a lungo e non esiste un heap di nuova generazione per promuovere ulteriormente gli oggetti.

  • Il Garbage Collector ha un heap aggiuntivo per oggetti di grandi dimensioni noto come Large Object Heap (LOH).

  • È riservato agli oggetti di 85.000 byte o superiori.

  • Gli oggetti di grandi dimensioni non vengono assegnati ai cumuli generazionali, ma vengono assegnati direttamente al LOH

  • Le raccolte di seconda generazione e LOH possono richiedere molto tempo per i programmi in esecuzione da molto tempo o che operano su grandi quantità di dati.

  • È noto che i programmi server di grandi dimensioni hanno cumuli di decine di GB.

  • Il GC utilizza una varietà di tecniche per ridurre il tempo di blocco dell'esecuzione del programma.

  • L'approccio principale consiste nell'eseguire il maggior numero di operazioni di garbage collection possibile su un thread in background in un modo che non interferisca con l'esecuzione del programma.

  • Il GC espone anche alcuni modi in cui gli sviluppatori possono influenzare il suo comportamento, il che può essere molto utile per migliorare le prestazioni.