Что такое сборщик мусора и как он работает в .NET
Что проверяют
Понимаете ли вы поколенческую модель и что делать с неуправляемыми ресурсами. Второе важнее: сборщик не знает про файлы и соединения.
Как отвечать
Сборщик мусора освобождает память объектов, до которых больше нельзя добраться из корней (стек, статические поля, регистры). Работает по принципу пометки и сжатия: живые объекты находятся, остальные удаляются, память уплотняется, чтобы не фрагментироваться.
Ключевая идея это поколения:
- нулевое: новые объекты, сборка частая и дешёвая, большинство объектов умирает здесь;
- первое: пережившие одну сборку, буфер между нулевым и вторым;
- второе: долгожители, сборка редкая и дорогая, обходит всю кучу.
Отдельно существует куча больших объектов (от 85 килобайт), которая по умолчанию не уплотняется, поэтому большие массивы стоит переиспользовать через пул.
Что важно сказать про ресурсы: сборщик управляет памятью, но не файлами, сокетами и соединениями с базой. Для них есть IDisposable и using, а финализатор это последний рубеж, а не основной способ.
using var stream = File.OpenRead(path); // Dispose вызовется детерминированноГде спотыкаются
Полагаются на финализатор вместо Dispose: момент его вызова не определён, а объект с финализатором живёт минимум на одну сборку дольше.
Зовут GC.Collect() руками. Почти всегда это вредно: сборщик подстраивается под нагрузку, а принудительная сборка сбивает его эвристики.
Не знают про утечки в управляемой памяти: объект, на который остаётся ссылка из статического поля, события или незакрытой подписки, не соберётся никогда.