Режимы задержки
Обновлен: Ноябрь 2007
Чтобы получить объекты, сборщик мусора должен остановить все выполняющиеся потоки приложения. В некоторых ситуациях, например при получении приложением данных или при отображении содержимого, полная сборка мусора может произойти в критическое время и привести к снижению производительности. Можно настроить уровень вмешательства сборщика мусора путем задания для свойства LatencyMode одного из значений GCLatencyMode.
Задержка относится ко времени, в течение которого сборщик мусора вмешается в работу приложения. Во время периодов задержки сборщик мусора более консервативен при получении объектов и сильно не вмешивается в работу приложений. Сборки поколения 2 возникают реже, что приводит к росту рабочего набора приложения со временем. В результате рекомендуется использовать режим LowLatency только в течение коротких промежутков времени, только при необходимости. В противном случае, если в системе возникает нехватка памяти, сборщик мусора начнет сборку, что приведет к кратковременной остановке приложения и прервет срочную задачу.
Следует использовать режим задержки для тех приложений, которые содержат блок кода, выполняемый в течение краткого времени, и которые должны выполняться практически без вмешательств среды выполнения. Несмотря на то, что режим LowLatency предназначен для использования в сценариях с ограничениями по времени, он не предназначен в качестве решения для тех сценариев, в которых существуют строгие ограничения по времени выполнения.
В следующей таблице представлены сценарии работы приложений, для которых предназначены различные значения GCLatencyMode.
Режим задержки |
Сценарии приложения |
---|---|
Для приложений, которые не имеют пользовательского интерфейса или операций на стороне сервера.
|
|
Для большинства приложений, имеющих пользовательский интерфейс. |
|
Для приложений с кратковременными, срочными операциями, для которых вмешательства сборщика мусора могут оказаться критическими. Например, приложения, которые отрисовывают анимацию или выполняют функции получения данных. |
Режимы сборки мусора по умолчанию
Если свойство LatencyMode не задано, в качестве режима по умолчанию будет использоваться параллельная сборка мусора рабочей станции. Режим зависит от значения двух параметров конфигурации среды выполнения.
-
Этот параметр указывает на то, что среда CLR выполняет сборку мусора рабочей станции в отдельном потоке для поддержки параллельных операций. Этот параметр включен по умолчанию.
-
Этот параметр указывает на то, что среда CLR выполняет сборку мусора сервера; в противном случае выполняется сборка мусора рабочей станции. Сборку мусора сервера можно использовать только на компьютерах с двумя или большим числом процессоров. По умолчанию она не включена.
Если этот параметр включен, параметр <gcConcurrent> автоматически отключается.
Ниже приведены значения по умолчанию для параметра GCLatencyMode.
Interactive, если режим <gcConcurrent> включен, а режим <gcServer> отключен.
Batch, если режим <gcConcurrent> отключен или если оба режима — <gcConcurrent> и <gcServer> — включены.
![]() |
---|
Параллельная сборка мусора не поддерживается в приложениях, использующих эмулятор платформ x86 WOW64 на 64-разрядных системах, которые реализуют архитектуру Intel Itanium (прежнее название — IA-64). Дополнительные сведения об использовании WOW64 в 64-разрядных версиях Windows см. в разделе о запуске 32-разрядных приложений. |
Руководство по использованию небольшой задержки
При использовании режима LowLatency ознакомьтесь со следующими правилами:
Оставляйте промежуток времени при небольших задержках как можно меньшим.
Избегайте выделения больших объемов памяти во время периодов с небольшой задержкой. Уведомления о нехватке памяти могут отображаться потому, что сборщик мусора получает меньшее количество объектов.
При работе в режиме небольшой задержки уменьшите количества выделений: для кучи больших объектов и для закрепленных объектов.
Помните о потоках, которые сами могут выделять ресурсы. Так как установка свойства LatencyMode происходит на уровне системы, можно создать исключение OutOfMemoryException в любом потоке, который может выделять ресурсы.
Заверните код небольшой задержки в области CER (дополнительные сведения см. в разделе Области с ограничением управления).
Можно принудительно запустить сборку поколения 2 во время периодов небольшой задержки посредством вызова метода GC.Collect(Int32, GCCollectionMode).
См. также
Задачи
Практическое руководство. Запрет параллельной сборки мусора