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


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

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

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

Параметры низкой задержки

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

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

  • 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).

См. также