Сборщик мусора (Garbage Collector, GC) в .NET — это автоматический менеджер памяти, который освобождает ресурсы, удаляя объекты, которые больше не используются приложением. Вот как это работает:
Трассировка (Marking)
GC начинает с "корневых" объектов (глобальные переменные, статические поля, локальные переменные в стеке и регистры CPU). Он рекурсивно помечает все достижимые объекты как "живые".
Сборка (Sweeping)
Все непомеченные объекты считаются мусором. Их память освобождается (но не всегда возвращается ОС — может остаться в кучу для будущих объектов).
Компактификация (Compacting)
Для уменьшения фрагментации GC может переместить живые объекты в начало кучи, обновив все ссылки на них.
// Пример: объект становится мусором, когда на него нет ссылок
var obj = new object(); // Создаем объект
obj = null; // Теперь объект может быть собран GC
GC использует 3 поколения (Gen0, Gen1, Gen2), чтобы оптимизировать процесс сборки:
Gen0 (Молодое поколение)
Gen1 (Промежуточное поколение)
Gen2 (Старое поколение)
Эмпирическая оптимизация
Исследования (например, IBM's Java GC papers) показали, что 3 поколения дают лучший баланс между:
Закон убывающей отдачи
Реальные паттерны использования
// Пример: как объекты перемещаются между поколениями
var obj = new object(); // Gen0
GC.Collect(0); // Если obj выжил → Gen1
GC.Collect(1); // Если obj выжил → Gen2
3 поколения — это компромисс между производительностью сборки молодых объектов и накладными расходами на отслеживание старых, основанный на статистике поведения объектов в реальных приложениях.