Класс System.GC

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Класс GC управляет сборщиком мусора. Сборщик мусора — это компонент среды CLR, который управляет выделением и выпуском управляемой памяти. Методы этого класса влияют на то, что сборка мусора выполняется в объекте и когда ресурсы, выделенные объектом, освобождаются. Свойства этого класса содержат сведения о общем объеме памяти, доступном в системе, а также возрастной категории или поколении памяти, выделенной объекту.

Сборщик мусора отслеживает и освобождает объекты, выделенные в управляемой памяти. Периодически сборщик мусора выполняет сборку мусора для освобождения памяти, выделенной для объектов, для которых нет допустимых ссылок. Сборка мусора происходит автоматически, когда запрос на память не может быть удовлетворен с помощью доступной свободной памяти. Кроме того, приложение может принудительно выполнить сборку мусора Collect с помощью метода.

Сборка мусора состоит из следующих шагов:

  1. Сборщик мусора ищет управляемые объекты, на которые ссылается управляемый код.
  2. Сборщик мусора пытается завершить объекты, на которые не ссылаются.
  3. Сборщик мусора освобождает объекты, на которые не ссылаются, и освобождает память.

Неуправляемые ресурсы

Во время сбора сборщик мусора не освобождает объект, если он находит одну или несколько ссылок на объект в управляемом коде. Однако сборщик мусора не распознает ссылки на объект из неуправляемого кода и может освободить объекты, которые используются исключительно в неуправляемом коде, если это не было явно запрещено. Этот KeepAlive метод предоставляет механизм, позволяющий сборщику мусора собирать объекты, которые по-прежнему используются в неуправляемом коде.

Помимо выделения управляемой памяти реализация сборщика мусора не поддерживает сведения о ресурсах, содержащихся в объекте, например дескрипторах файлов или подключения к базе данных. Если тип использует неуправляемые ресурсы, которые должны быть освобождены перед восстановлением экземпляров типа, тип может реализовать метод завершения.

В большинстве случаев методы завершения реализуются путем переопределения Object.Finalize метода. Однако типы, написанные в C# или C++, реализуют деструкторы, которые компиляторы превратят в переопределение Object.Finalize. В большинстве случаев, если объект имеет метод завершения, сборщик мусора вызывает его до освобождения объекта. Однако сборщик мусора не требуется вызывать методы завершения во всех ситуациях; Например, SuppressFinalize метод явным образом предотвращает вызов метода завершения объекта. Кроме того, сборщик мусора не требуется использовать определенный поток для завершения объектов или гарантировать порядок вызова методов завершения для объектов, которые ссылаются друг на друга, но в противном случае доступны для сборки мусора.

В сценариях, когда ресурсы должны быть освобождены в определенное время, классы могут реализовать IDisposable интерфейс, содержащий IDisposable.Dispose метод, который выполняет задачи управления ресурсами и очистки. Классы, реализующие Dispose , должны указывать в рамках контракта класса, если и когда потребители классов вызывают метод для очистки объекта. Сборщик мусора по умолчанию не вызывает Dispose метод. Однако реализации Dispose метода могут вызывать методы в GC классе для настройки поведения завершения сборщика мусора.

Дополнительные сведения о завершении объектов и шаблоне удаления см. в разделе "Очистка неуправляемых ресурсов".

Старение объектов и поколения

Сборщик мусора в среде CLR поддерживает старение объектов с помощью поколений. Поколение — это единица измерения относительного возраста объектов в памяти. Номер поколения или возраст объекта указывает на поколение, к которому принадлежит объект. Объекты, созданные недавно, являются частью новых поколений и имеют более низкие числа поколений, чем объекты, созданные ранее в жизненном цикле приложения. Объекты в последнем поколении находятся в поколении 0. Эта реализация сборщика мусора поддерживает три поколения объектов, поколений 0, 1 и 2. Значение свойства можно получить MaxGeneration , чтобы определить максимальное число поколения, поддерживаемое системой.

Удаление объектов позволяет приложениям целевой сборки мусора в определенном наборе поколений, а не требовать от сборщика мусора для оценки всех поколений. Перегрузки Collect метода, включающего generation параметр, позволяют указать самое старое поколение для сбора мусора.

Запрет сборки мусора

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

Вы определяете начало критического пути без региона GC путем вызова одной из перегрузок.TryStartNoGCRegion Вы указываете конец его критического пути путем вызова EndNoGCRegion метода.

Не удается вложить вызовы к методу TryStartNoGCRegion , и метод следует вызывать EndNoGCRegion только в том случае, если среда выполнения в настоящее время не находится в режиме задержки региона GC. Другими словами, не TryStartNoGCRegion следует вызывать несколько раз (после первого вызова метода последующие вызовы не будут успешными), и не следует ожидать, что EndNoGCRegion вызовы будут успешными только потому, что первый вызов TryStartNoGCRegion выполнен успешно.