Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
В этой статье приводятся дополнительные замечания к справочной документации по этому API.
Класс GC управляет сборщиком мусора. Сборщик мусора — это компонент среды CLR, который управляет выделением и выпуском управляемой памяти. Методы этого класса влияют на то, что сборка мусора выполняется в объекте и когда ресурсы, выделенные объектом, освобождаются. Свойства этого класса содержат сведения о общем объеме памяти, доступном в системе, а также возрастной категории или поколении памяти, выделенной объекту.
Сборщик мусора отслеживает и освобождает объекты, которые были выделены в управляемой памяти. Время от времени сборщик мусора выполняет очистку памяти для освобождения памяти, выделенной для объектов, на которые нет действующих ссылок. Сборка мусора происходит автоматически, когда запрос на память не может быть удовлетворен с помощью доступной свободной памяти. Кроме того, приложение может заставить сборку мусора с помощью метода Collect.
Сборка мусора состоит из следующих шагов:
- Сборщик мусора ищет управляемые объекты, на которые ссылается управляемый код.
- Сборщик мусора пытается финализировать объекты, на которые не ссылаются.
- Сборщик мусора освобождает объекты, на которые больше нет ссылок, и восстанавливает их память.
Неуправляемые ресурсы
Во время сбора сборщик мусора не освобождает объект, если он находит одну или несколько ссылок на объект в управляемом коде. Однако сборщик мусора не распознает ссылки на объект из неуправляемого кода и может освободить объекты, которые используются исключительно в неуправляемом коде, если это не было явно запрещено. Этот 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 путем вызова одной из перегрузок.TryStartNoGCRegion Вы указываете конец его критического пути путем вызова EndNoGCRegion метода.
Не удается вложить вызовы к методу TryStartNoGCRegion , и метод следует вызывать EndNoGCRegion только в том случае, если среда выполнения в настоящее время не находится в режиме задержки региона GC. Другими словами, не следует вызывать TryStartNoGCRegion несколько раз (после первого вызова метода последующие вызовы не будут успешными), и не следует ожидать, что вызовы на EndNoGCRegion будут успешными только потому что первый вызов на TryStartNoGCRegion был успешным.