Какие объекты находятся в Generation 0 (нулевом поколении) сборщика мусора .NET?

«Какие объекты находятся в Generation 0 (нулевом поколении) сборщика мусора .NET?» — вопрос из категории Управление памятью, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Generation 0 находятся самые «молодые», недавно размещённые в управляемой куче объекты, которые ещё ни разу не пережили процедуру сборки мусора (Garbage Collection, GC).

Ключевые характеристики Generation 0:

  • Короткое время жизни: Сюда попадают временные объекты, созданные в методах (локальные переменные, промежуточные результаты).
  • Маленький размер: Размер Generation 0 ограничен (обычно порядка нескольких мегабайт), что делает его очистку очень быстрой.
  • Частая сборка: Сборщик мусора проверяет Generation 0 наиболее часто, так как статистика показывает, что большинство объектов умирает молодыми.
  • Быстрое продвижение: Объекты, пережившие сборку мусора в Generation 0, продвигаются (promoted) в Generation 1.

Пример и наблюдение:

// Создаём объект. Он размещается в Generation 0.
var tempObject = new byte[1024];

// Выводим текущее поколение объекта (0).
Console.WriteLine(GC.GetGeneration(tempObject)); // 0

// Инициируем сборку мусора для Generation 0.
GC.Collect(0);
GC.WaitForPendingFinalizers();

// Если объект всё ещё имеет ссылку (не был собран),
// он будет продвинут в Generation 1.
Console.WriteLine(GC.GetGeneration(tempObject)); // 1 (если выжил)

Почему это важно для производительности? Оптимизация кода часто сводится к уменьшению количества объектов, переживающих сборку в Generation 0, и снижению давления на эту область памяти. Использование структур (struct), пулов объектов (ArrayPool<T>) и избегание лишних аллокаций в горячих путях — прямые следствия понимания этой модели.