Поделиться через


Индуцированные коллекции

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

Используйте метод GC.Collect, если обнаружите заметное уменьшение объема доступной памяти в определенной точке кода приложения. Например, если приложение использует сложное диалоговое окно с несколькими элементами управления, вызов Collect при закрытом диалоговом окне может повысить производительность, немедленно очищая память, выделенную для этого окна. Убедитесь, что приложение не запускает сборку мусора слишком часто, потому что это может уменьшить производительность, если сборщик мусора непродуктивно пытается удалить объекты в не самое удачное время. Можно передать значение перечисления GCCollectionMode.Optimized в метод Collect, чтобы осуществлять сбор только в случае его эффективности, как описано в следующем разделе.

Режим сборки мусора

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

Значение GCCollectionMode Description
Default Использует настройку сборки мусора по умолчанию для текущей версии .NET.
Forced Вызывает немедленное выполнение принудительной сборки мусора. Это эквивалентно вызову перегрузки метода GC.Collect(). В результате образуется коллекция полной блокировки всех поколений.

Можно также сжать кучу больших объектов, установив для свойства GCSettings.LargeObjectHeapCompactionMode значение GCLargeObjectHeapCompactionMode.CompactOnce перед запуском немедленной сборки мусора с полной блокировкой.
Optimized Позволяет сборщику мусора определить, является ли текущий момент оптимальным для освобождения объектов.

Сборщик мусора может определить, что сборка мусора будет недостаточно продуктивна, в этом случае он возвратится без удаления объектов.

Фоновые или блокирующие сборки

Вы можете вызвать перегрузку метода GC.Collect(Int32, GCCollectionMode, Boolean), чтобы указать, является ли принудительная сборка блокирующей. Тип выполняемой сборки зависит от сочетания значений, установленных для параметров mode и blocking. mode является элементом перечисления GCCollectionMode, а blocking — это значение Boolean. В следующей таблице описаны разные сочетания аргументов mode и blocking.

mode blocking = true blocking = false
Forced или Default Блокирующий сбор выполнится, как только это станет возможным. Если в это время выполняется фоновая сборка и параметр поколения имеет значение 0 или 1, метод Collect(Int32, GCCollectionMode, Boolean) немедленно запускает блокирующую сборку и возвращает управление по ее завершении. Если выполняется фоновая сборка и параметр generation имеет значение 2, метод дожидается завершения фоновой сборки, активирует блокирующую сборку поколения 2 и возвращает управление. Сборка выполнится, как только это станет возможным. Метод Collect(Int32, GCCollectionMode, Boolean) запрашивает фоновую сборку, но не гарантирует этот режим. В зависимости от обстоятельств может выполняться блокирующая сборка. Если фоновая сборка уже выполняется, метод возвращает управление немедленно.
Optimized В зависимости от текущего состояния сборщика мусора и значения параметра generation может выполняться блокирующая сборка. Сборщик мусора пытается обеспечить оптимальную производительность. Сборка может быть выполнена в зависимости от состояния сборщика мусора. Метод Collect(Int32, GCCollectionMode, Boolean) запрашивает фоновую сборку, но не гарантирует этот режим. В зависимости от обстоятельств может выполняться блокирующая сборка. Сборщик мусора пытается обеспечить оптимальную производительность. Если фоновая сборка уже выполняется, метод возвращает управление немедленно.

См. также