GC в .NET не сканирует всю кучу при каждой сборке. Он опирается на простое наблюдение: большинство объектов живут очень недолго. Временные строки, локальные коллекции, промежуточные результаты вычислений часто умирают почти сразу после создания.
Поэтому управляемая куча разделена на поколения.
🟢 Gen0 — сюда попадают новые объекты. Сборка происходит часто и быстро.
🟢 Gen1 — промежуточное поколение для объектов, переживших сборку Gen0.
🟢 Gen2 — долгоживущие объекты: кеши, синглтоны, крупные структуры приложения. Проверяется значительно реже.
Такой подход позволяет GC большую часть времени работать только с небольшим количеством свежих объектов, не тратя ресурсы на всю кучу целиком.
🔜 Отдельно существует LOH (Large Object Heap). Туда попадают крупные объекты размером примерно от 85 КБ, чаще всего большие массивы. LOH обычно не уплотняется при обычных сборках, поэтому со временем может фрагментироваться.
Практический вывод:
✅ уменьшайте количество временных объектов на горячих путях;
✅ избегайте лишних аллокаций в циклах;
✅ переиспользуйте большие буферы через ArrayPool<T>, чтобы не нагружать LOH.
📚 Что почитать дальше:
«Фундаментальные основы сборщика мусора .NET» — один из лучших материалов для понимания поколений, LOH, режимов работы GC и причин пауз при сборке мусора.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминатор
