Aller au contenu

Générations 0, 1, 2

Contexte : Pour améliorer l’efficacité, le GC divise le tas managé en trois générations : 0, 1 et 2. Les objets nouvellement alloués commencent dans la génération 0. Lors d’une collecte, les objets qui survivent sont promus à la génération suivante. Comme la plupart des objets meurent jeunes (variables temporaires), collecter uniquement la génération 0 est rapide et fréquent. Les objets qui survivent à plusieurs collectes (données statiques, caches) finissent en génération 2, qui est rarement collectée.

GénérationDurée de vie typiqueFréquence de collecte
0Très courte (variables locales)Très fréquente
1Tampon (objets ayant survécu à Gen0)Moins fréquente
2Longue durée (objets statiques, singletons)Rare
using System;
class Program
{
static void Main()
{
var obj = new object();
Console.WriteLine($"Génération initiale : {GC.GetGeneration(obj)}"); // 0
GC.Collect(); // Collecte Gen0
Console.WriteLine($"Après première collecte : {GC.GetGeneration(obj)}"); // 1
GC.Collect(); // Collecte Gen1 (promotion)
Console.WriteLine($"Après deuxième collecte : {GC.GetGeneration(obj)}"); // 2
GC.Collect();
Console.WriteLine($"Toujours en Gen2 : {GC.GetGeneration(obj)}"); // 2
}
}
Fenêtre de terminal
dotnet run
Génération initiale : 0
Après première collecte : 1
Après deuxième collecte : 2
Toujours en Gen2 : 2
  • Évitez d’appeler GC.Collect() manuellement – cela perturbe les heuristiques du GC.
  • Les objets Gen2 sont rarement collectés, évitez donc les allocations inutiles à longue durée de vie.

Service de cache – Les entrées de cache doivent être stockées avec des références faibles ou conçues soigneusement pour éviter de promouvoir trop d’objets en Gen2, ce qui augmenterait l’empreinte mémoire.
Voir documentation .NET sur les générations.