Когда вызывается сборка мусора в C# .NET

Сборщик мусора (Garbage Collector, GC) в .NET управляет автоматическим освобождением памяти, удаляя объекты, которые больше не используются. Запуск GC происходит не в фиксированные моменты времени, а при возникновении определённых условий.

1. Недостаток доступной памяти Когда система обнаруживает нехватку оперативной памяти, GC запускается, чтобы освободить место, удаляя неиспользуемые объекты. Это особенно актуально в средах с ограниченными ресурсами, таких как мобильные устройства или серверные приложения с высокой нагрузкой.

2. Переполнение поколения 0 Объекты, создаваемые в .NET, изначально размещаются в поколении 0. Если память поколения 0 заполняется, происходит сборка мусора этого поколения. Объекты, которые остаются после этой сборки, перемещаются в следующее поколение.

3. Вызов GC.Collect() вручную Метод GC.Collect() позволяет принудительно запустить сборку мусора. Однако его частое использование может привести к снижению производительности, поскольку GC приостанавливает выполнение приложения во время работы.

GC.Collect();
GC.WaitForPendingFinalizers();

4. Завершение программы или выгрузка домена приложения При завершении работы приложения или выгрузке домена приложения выполняется полная сборка мусора, включая очистку статических объектов и вызов финализаторов (~ClassName()), если они определены.

5. Уменьшение доступной памяти в системе При нехватке общей системной памяти среда выполнения может инициировать сборку мусора, даже если в управляемой памяти .NET ещё есть свободное место.

6. Таймеры и фоновые задачи Некоторые версии .NET могут запускать GC в фоновом режиме, анализируя поведение приложения. Например, серверный GC в .NET работает в многопоточной среде и может запускать сборку мусора асинхронно.

7. Долгое время простоя приложения Если приложение долго находится в режиме ожидания, GC может запуститься, чтобы освободить память перед следующей активной фазой работы.