Режимы задержки

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

В некоторых ситуациях, например, когда приложение получает данные или отображает содержимое, полная сборка мусора может произойти в критическое время и снизить производительность. Степень вмешательства сборщика мусора можно настроить, присвоив свойству GCSettings.LatencyMode одно из значений System.Runtime.GCLatencyMode.

Параметры режима небольшой задержки

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

Перечисление System.Runtime.GCLatencyMode предоставляет 2 параметра малого времени ожидания:

  • GCLatencyMode.LowLatency отключает сборку мусора для объектов поколения 2 и выполняет только сборку мусора для объектов поколений 0 и 1. Его можно использовать только в течение коротких периодов времени. Если в системе за продолжительный период возникнет нехватка памяти, сборщик мусора начнет сборку, что приведет к кратковременной остановке приложения и прервет срочную задачу. Этот параметр доступен только для сборки мусора на рабочей станции.

  • GCLatencyMode.SustainedLowLatency отключает приоритетную сборку мусора для объектов поколения 2 и выполняет только сборку для объектов поколений 0 и 1, а также фоновую сборку для объектов поколения 2. Его можно использовать дольше и он доступен для сборки мусора как на рабочей станции, так и на сервере. Этот параметр нельзя использовать, если фоновая сборка мусора отключена.

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

  • система получит уведомление о нехватке памяти от операционной системы;

  • Код приложения запустит сборку мусора путем вызова метода GC.Collect и укажет значение 2 для параметра generation.

Сценарии

В следующей таблице перечислены сценарии работы приложений с использованием значений GCLatencyMode:

Режим периода ожидания Сценарии приложений
Batch Для приложений, которые не имеют пользовательского интерфейса или операций на стороне сервера.

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

Это режим по умолчанию для сборки мусора рабочей станции и сервера. Тем не менее, в случае с размещенным приложением, приоритет будут иметь параметры сборки мусора, задаваемые в ведущем процессе.
LowLatency Для приложений, которые осуществляют операции, чувствительные ко времени выполнения, для которых перерывы в работе из-за сборки мусора могут иметь резко отрицательные последствия. Например, это приложения, которые выполняют визуализацию анимации или получение данных.
SustainedLowLatency Для приложений, которые осуществляют операции, чувствительные ко времени выполнения, время выполнения которых ограничено, но может быть достаточно продолжительным, для которых перерывы в работе из-за сборки мусора могут иметь резко отрицательные последствия. Например, приложения, требующие быстрого отклика при изменении рыночных показателей в торговую сессию.

Этот режим использует больший размер управляемой кучи, нежели другие режимы. Так как он не сжимает управляемую кучу, возможен больший уровень фрагментации. Необходимо обеспечить достаточный объем памяти.

Рекомендации по использованию режима небольшой задержки

При использовании режима GCLatencyMode.LowLatency придерживайтесь следующих рекомендаций.

  • Продолжительность периодов небольшого времени ожидания должна быть как можно более короткой.

  • Избегайте выделения больших объемов памяти в периоды небольшого времени ожидания. Могут возникать уведомления о нехватке памяти, потому что сборщик мусора освобождает меньше объектов.

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

  • Не забывайте про потоки, которые могут выделять память. Поскольку свойство LatencyMode относится ко всему процессу, исключения OutOfMemoryException можно создать в любом потоке, выделяющем память.

  • Заключите код режима небольшой задержки в области ограниченного выполнения. Дополнительные сведения см. в статье Области ограниченного выполнения.

  • Можно принудительно запускать освобождение объектов поколения 2 в периоды небольшого времени ожидания путем вызова метода GC.Collect(Int32, GCCollectionMode).

См. также