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


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

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

Задержка относится ко времени, в течение которого сборщик мусора вмешается в работу приложения. Во время периодов небольших задержек сборщик мусора более консервативен при сборе объектов и меньше вмешивается в работу приложений. Рекомендуется использовать режим GCLatencyMode.LowLatency, когда он нужен, только в течение короткого интервала времени. В противном случае, если в системе возникает нехватка памяти, сборщик мусора начнет сборку, что приведет к кратковременной остановке приложения и прервет срочную задачу.

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

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

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

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

В следующей таблице представлены сценарии работы приложений, для которых предназначены различные значения GCLatencyMode.

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

Сценарии приложения

Batch

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

Interactive

Для большинства приложений, имеющих пользовательский интерфейс.

LowLatency

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

Режимы сборки мусора по умолчанию

Если свойство LatencyMode не задано, в качестве режима по умолчанию будет использоваться параллельная сборка мусора рабочей станции. Режим зависит от значения двух параметров конфигурации среды выполнения.

  • <gcConcurrent>

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

  • <gcServer>

    Этот параметр указывает на то, что среда CLR выполняет сборку мусора сервера; в противном случае выполняется сборка мусора рабочей станции. Сборку мусора сервера можно использовать только на компьютерах с двумя или большим числом процессоров. По умолчанию она не включена.

    Если этот параметр включен, параметр <gcConcurrent> автоматически отключается.

Ниже приведены значения по умолчанию для параметра GCLatencyMode.

  • Interactive, если режим <gcConcurrent> включен, а режим <gcServer> отключен.

  • Batch, если режим <gcConcurrent> отключен или включен режим <gcServer>.

ПримечаниеПримечание

Параллельная сборка мусора не поддерживается в приложениях, использующих эмулятор платформ x86 WOW64 на 64-разрядных системах, которые реализуют архитектуру Intel Itanium (прежнее название — IA-64).

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

При использовании режима LowLatency ознакомьтесь со следующими правилами:

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

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

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

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

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

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

См. также

Задачи

Практическое руководство. Запрет параллельной сборки мусора

Основные понятия

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

Сборка мусора