Режимы задержки
Чтобы получить объекты, сборщик мусора должен остановить все выполняющиеся потоки приложения. В некоторых ситуациях, например при получении приложением данных или при отображении содержимого, полная сборка мусора может произойти в критическое время и привести к снижению производительности. Можно настроить уровень вмешательства сборщика мусора путем задания для свойства GCSettings.LatencyMode одного из значений System.Runtime.GCLatencyMode.
Задержка относится ко времени, в течение которого сборщик мусора вмешается в работу приложения. Во время периодов небольших задержек сборщик мусора более консервативен при сборе объектов и меньше вмешивается в работу приложений. Рекомендуется использовать режим GCLatencyMode.LowLatency, когда он нужен, только в течение короткого интервала времени. В противном случае, если в системе возникает нехватка памяти, сборщик мусора начнет сборку, что приведет к кратковременной остановке приложения и прервет срочную задачу.
Во время периодов небольших задержек сборки поколения 2 подавляются, если не происходят следующие события:
система получает от операционной системы уведомление о нехватке памяти:
код приложения запускает сборку, вызывая метод GC.Collect и задавая значение 2 для параметра generation.
Следует использовать режим задержки для тех приложений, которые содержат блок кода, выполняемый в течение краткого времени, и которые должны выполняться практически без вмешательств среды выполнения. Несмотря на то, что режим LowLatency предназначен для использования в сценариях с ограничениями по времени, он не предназначен в качестве решения для тех сценариев, в которых существуют строгие ограничения по времени выполнения.
В следующей таблице представлены сценарии работы приложений, для которых предназначены различные значения GCLatencyMode.
Режим задержки |
Сценарии приложения |
---|---|
Для приложений, которые не имеют пользовательского интерфейса или операций на стороне сервера. |
|
Для большинства приложений, имеющих пользовательский интерфейс. |
|
Для приложений с кратковременными, чувствительными к длительности операциями, в течение которых вмешательства сборщика мусора могут оказаться критическими. Например, приложения, которые отрисовывают анимацию или выполняют функции получения данных. |
Режимы сборки мусора по умолчанию
Если свойство LatencyMode не задано, в качестве режима по умолчанию будет использоваться параллельная сборка мусора рабочей станции. Режим зависит от значения двух параметров конфигурации среды выполнения.
-
Этот параметр указывает на то, что среда CLR выполняет сборку мусора рабочей станции в отдельном потоке для поддержки параллельных операций. Этот параметр включен по умолчанию.
-
Этот параметр указывает на то, что среда 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).
См. также
Задачи
Практическое руководство. Запрет параллельной сборки мусора