Sobes.tech
Senior

Come avviene la divisione degli oggetti negli heap?

sobes.tech AI

Risposta dell'AI

In .NET, lo heap (heap) è diviso in due generazioni principali: Generazione 0 e Generazione 1. Se necessario, viene creata la Generazione 2.

  • Generazione 0 (Gen 0): Gli oggetti appena creati vengono collocati qui. È la generazione più giovane e più piccola. Il garbage collector (GC) verifica e pulisce questa generazione più frequentemente. Gli oggetti che sopravvivono alla raccolta in Gen 0 vengono spostati in Gen 1.
  • Generazione 1 (Gen 1): Contiene oggetti che hanno sopravvissuto alla raccolta in Gen 0. Il GC verifica questa generazione meno frequentemente di Gen 0. Gli oggetti che sopravvivono alla raccolta in Gen 1 vengono spostati in Gen 2.
  • Generazione 2 (Gen 2): Contiene oggetti di lunga durata di Gen 1, così come grandi oggetti. Il GC verifica questa generazione meno frequentemente. La raccolta in Gen 2 è la più costosa in termini di tempo.
  • Heap di oggetti grandi (LOH): Area speciale dell'heap per oggetti di 85 KB o più. Gli oggetti in LOH non vengono spostati dal GC, poiché il loro spostamento è molto costoso. La pulizia di LOH avviene insieme alla raccolta di Gen 2.

La divisione in generazioni si basa sull'ipotesi che gli oggetti recentemente creati diventino più rapidamente rifiuti rispetto a quelli di lunga durata. Questo approccio consente al GC di pulire efficacemente la memoria, concentrandosi sulle generazioni più giovani.

// Esempio di creazione di oggetti in Generazione 0
object obj1 = new object();
string str1 = "Hello";

// Dopo la prima raccolta di rifiuti in Gen 0, se obj1 e str1 sono ancora necessari,
// possono essere spostati in Generazione 1.

// Oggetto di lunga durata
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
    longLivedList.Add(i);
}
// Questa lista può salire in Generazione 2 nel tempo.

// Grande oggetto, che sarà collocato in LOH
byte[] largeArray = new byte[100 * 1024]; // Dimensione > 85 KB