Quali sono le fasi di pulizia delle risorse nella gestione della memoria?
sobes.tech AI
Risposta dell'AI
La gestione della memoria in .NET include le seguenti fasi di pulizia delle risorse:
-
Fase di marcatura (Marking): Il garbage collector determina quali oggetti sono accessibili dagli oggetti radice (variabili dello stack, variabili statiche e registri). Gli oggetti non accessibili vengono contrassegnati per la raccolta.
-
Fase di spostamento (Relocating/Compacting): Gli oggetti accessibili vengono spostati (compattati) in memoria, liberando spazio contiguo e riducendo la frammentazione. Durante questa fase, vengono aggiornati i puntatori agli oggetti spostati. Questa fase è presente solo nelle build diverse da quella in background.
-
Fase di pulizia (Sweeping): Vengono chiamati i metodi finali (
Finalize) degli oggetti contrassegnati per la raccolta, se definiti. Successivamente, viene liberata la memoria occupata da questi oggetti.
Esempio di utilizzo di Finalize (non raccomandato, è meglio usare IDisposable):
public class ResourceHolder
{
// Risorsa che richiede rilascio
private System.IO.StreamWriter _writer;
public ResourceHolder(string filePath)
{
_writer = new System.IO.StreamWriter(filePath);
}
// Metodo finale, chiamato dal garbage collector
~ResourceHolder()
{
// Rilasciare risorsa non gestita
_writer?.Dispose();
}
// Altri metodi della classe...
}