Параметры конфигурации времени выполнения для сборки мусора

Эта страница содержит сведения о параметрах сборщика мусора (GC), которые можно изменить во время выполнения. Если вы пытаетесь добиться пиковой производительности запущенных приложений, рекомендуется использовать эти параметры. Однако значения по умолчанию обеспечивают оптимальную производительность для большинства приложений в типичных ситуациях.

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

Примечание

  • Эти параметры также могут динамически изменяться приложением во время его выполнения, поэтому любые заданные параметры времени выполнения могут быть переопределены.
  • Некоторые параметры, такие как уровень задержки, обычно задаются только через API во время разработки. Такие параметры будут пропущены на этой странице.
  • Для числовых значений используйте десятичную нотацию для параметров в файле runtimeconfig.json и шестнадцатеричную нотацию для параметров переменных среды. Шестнадцатеричные значения можно указать с помощью префикса "0x" или без него.
  • Если вы используете переменные среды, .NET 6 стандартизует префикс DOTNET_ вместо COMPlus_. Но префикс COMPlus_ будет и дальше работать. Если вы используете предыдущую версию среды выполнения .NET, следует и дальше использовать префикс COMPlus_, например COMPlus_gcServer.

Варианты сборки мусора

Два основных варианта сборки мусора — это сборка мусора рабочей станции и сборка мусора сервера. Дополнительные сведения о различиях между этими двумя вариантами см. в статье Сборка мусора рабочей станции и сборка мусора сервера.

Подвиды сборки мусора представлены фоновым и непараллельным выполнением.

Чтобы выбрать варианты сборки мусора, используйте следующие параметры:

Рабочая станция и сервер

  • Указывает, использует ли приложение сборку мусора рабочей станции или сборку мусора сервера.
  • По умолчанию: сборка мусора рабочей станции. Это эквивалентно присвоению значения false.
Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.Server false — рабочая станция
true — сервер
.NET Core 1.0
Свойство MSBuild ServerGarbageCollection false — рабочая станция
true — сервер
.NET Core 1.0
Переменная среды COMPlus_gcServer 0 — рабочая станция
1 — сервер
.NET Core 1.0
Переменная среды DOTNET_gcServer 0 — рабочая станция
1 — сервер
.NET 6
app.config для .NET Framework GCServer false — рабочая станция
true — сервер

Примеры

Файл runtimeconfig.json

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.Server": true
      }
   }
}

Файл проекта:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <ServerGarbageCollection>true</ServerGarbageCollection>
  </PropertyGroup>

</Project>

Фоновая сборка мусора

  • Указывает, включена ли фоновая (параллельная) сборка мусора.
  • По умолчанию: фоновая сборка мусора. Это эквивалентно присвоению значения true.
  • Дополнительные сведения см. в статье Фоновая сборка мусора.
Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.Concurrent true —фоновая сборка мусора
false — непараллельная сборка мусора
.NET Core 1.0
Свойство MSBuild ConcurrentGarbageCollection true —фоновая сборка мусора
false — непараллельная сборка мусора
.NET Core 1.0
Переменная среды COMPlus_gcConcurrent 1 —фоновая сборка мусора
0 — непараллельная сборка мусора
.NET Core 1.0
Переменная среды DOTNET_gcConcurrent 1 —фоновая сборка мусора
0 — непараллельная сборка мусора
.NET 6
app.config для .NET Framework gcConcurrent true —фоновая сборка мусора
false — непараллельная сборка мусора

Примеры

Файл runtimeconfig.json

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.Concurrent": false
      }
   }
}

Файл проекта:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>
  </PropertyGroup>

</Project>

Управление использованием ресурсов

Используйте следующие параметры для управления использованием памяти и ЦП в сборщике мусора:

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

Число куч

Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.HeapCount Десятичное значение .NET Core 3.0
Переменная среды COMPlus_GCHeapCount Шестнадцатеричное значение .NET Core 3.0
Переменная среды DOTNET_GCHeapCount Шестнадцатеричное значение .NET 6
app.config для .NET Framework GCHeapCount Десятичное значение .NET Framework 4.6.2

Пример.

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.HeapCount": 16
      }
   }
}

Совет

Если вы задаете параметр в runtimeconfig.json, укажите десятичное значение. Если вы задаете параметр в виде переменной среды, укажите шестнадцатеричное значение. Например, чтобы ограничить число куч значением 16, для JSON-файла нужно указать 16, а для переменной среды — 0x10 или 10.

Сходство маски

  • Указывает конкретные процессоры, которые должны использоваться потоками сборщика мусора.
  • Если сходство процессоров отключено, этот параметр игнорируется.
  • Применяется только к сборке мусора сервера.
  • Это значение представляет собой битовую маску, которая определяет доступные процессу процессоры. Например, десятичное значение 1023 (или шестнадцатеричное значение 0x3FF или 3FF, если вы используете переменную среды), равно 0011 1111 1111 в двоичной нотации. При этом будут использоваться первые 10 процессоров. Чтобы указать следующие 10 процессоров, то есть процессоры 10–19, задайте десятичное значение 1047552 (или шестнадцатеричное значение 0xFFC00 или FFC00), которое эквивалентно двоичному значению 1111 1111 1100 0000 0000.
Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.HeapAffinitizeMask Десятичное значение .NET Core 3.0
Переменная среды COMPlus_GCHeapAffinitizeMask Шестнадцатеричное значение .NET Core 3.0
Переменная среды DOTNET_GCHeapAffinitizeMask Шестнадцатеричное значение .NET 6
app.config для .NET Framework GCHeapAffinitizeMask Десятичное значение .NET Framework 4.6.2

Пример.

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.HeapAffinitizeMask": 1023
      }
   }
}

Сходство диапазонов

Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.GCHeapAffinitizeRanges Разделенный запятыми список номеров процессоров или диапазонов номеров процессоров.
Пример для Unix: "1-10,12,50-52,70"
Пример для Windows: "0:1-10,0:12,1:50-52,1:70"
.NET Core 3.0
Переменная среды COMPlus_GCHeapAffinitizeRanges Разделенный запятыми список номеров процессоров или диапазонов номеров процессоров.
Пример для Unix: "1-10,12,50-52,70"
Пример для Windows: "0:1-10,0:12,1:50-52,1:70"
.NET Core 3.0
Переменная среды DOTNET_GCHeapAffinitizeRanges Разделенный запятыми список номеров процессоров или диапазонов номеров процессоров.
Пример для Unix: "1-10,12,50-52,70"
Пример для Windows: "0:1-10,0:12,1:50-52,1:70"
.NET 6

Пример.

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.GCHeapAffinitizeRanges": "0:1-10,0:12,1:50-52,1:70"
      }
   }
}

Группы ЦП

  • Указывает, использует ли сборщик мусора группы ЦП.

    Когда 64-разрядный компьютер с Windows имеет несколько групп ЦП, то есть доступно более 64 процессоров, включение этого элемента расширяет действие сборки мусора на все группы ЦП. Сборщик мусора использует все ядра для создания и балансировки куч.

  • Применяется только к сборке мусора сервера в 64-разрядных операционных системах Windows.

  • По умолчанию: сборка мусора не распространяется на группы ЦП. Это эквивалентно присвоению значения 0.

  • Дополнительные сведения см. в записи об улучшении конфигурации ЦП для сборки мусора на компьютерах, имеющих более 64 ЦП, в блоге Майони Стивенс (Maoni Stephens).

Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.CpuGroup 0 — отключено
1 — включено
.NET 5
Переменная среды COMPlus_GCCpuGroup 0 — отключено
1 — включено
.NET Core 1.0
Переменная среды DOTNET_GCCpuGroup 0 — отключено
1 — включено
.NET 6
app.config для .NET Framework GCCpuGroup false — отключено
true — включено

Примечание

Чтобы настроить среду CLR для распределения потоков из пула потоков по всем группам ЦП, включите параметр Элемент Thread_UseAllCpuGroups. Для приложений .NET Core этот параметр можно включить, задав для переменной среды DOTNET_Thread_UseAllCpuGroups значение 1.

Сходство

  • Указывает, следует ли реализовать сходство потоков сборки мусора с процессорами. Реализация сходства потока сборки мусора означает, что он может выполняться только на определенном ЦП. Куча создается для каждого потока сборки мусора.
  • Применяется только к сборке мусора сервера.
  • По умолчанию: реализация сходства потоков сборки мусора с процессорами. Это эквивалентно присвоению значения false.
Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.NoAffinitize false — реализовать сходство
true — не реализовывать сходство
.NET Core 3.0
Переменная среды COMPlus_GCNoAffinitize 0 — реализовать сходство
1 — не реализовывать сходство
.NET Core 3.0
Переменная среды DOTNET_GCNoAffinitize 0 — реализовать сходство
1 — не реализовывать сходство
.NET 6
app.config для .NET Framework GCNoAffinitize false — реализовать сходство
true — не реализовывать сходство
.NET Framework 4.6.2

Пример.

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.NoAffinitize": true
      }
   }
}

Ограничение кучи

  • Указывает максимальный размер фиксации в байтах для кучи сборки мусора и учета сборки мусора.

  • Этот параметр применим только к 64-разрядным компьютерам.

  • Если настроены ограничения для отдельных куч объектов, этот параметр игнорируется.

  • Значение по умолчанию, которое применяется только в определенных случаях, превышает 20 МБ или 75 % предельного объема памяти в контейнере. Значение по умолчанию применяется, если:

    • процесс выполняется в контейнере с заданным предельным объемом памяти;
    • параметр System.GC.HeapHardLimitPercent не задан.
Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.HeapHardLimit Десятичное значение .NET Core 3.0
Переменная среды COMPlus_GCHeapHardLimit Шестнадцатеричное значение .NET Core 3.0
Переменная среды DOTNET_GCHeapHardLimit Шестнадцатеричное значение .NET 6

Пример.

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.HeapHardLimit": 209715200
      }
   }
}

Совет

Если вы задаете параметр в runtimeconfig.json, укажите десятичное значение. Если вы задаете параметр в виде переменной среды, укажите шестнадцатеричное значение. Например, чтобы задать для куч жесткое ограничение в 200 мебибайт (Миб), для JSON-файла нужно указать значение 209715200, а для переменной среды — значение 0xC800000 или C800000.

Ограничение кучи в процентах

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

  • Если также задан параметр System.GC.HeapHardLimit, этот параметр игнорируется.

  • Этот параметр применим только к 64-разрядным компьютерам.

  • Если процесс выполняется в контейнере с заданным предельным объемом памяти, процентная доля вычисляется как процент от этого объема памяти.

  • Если настроены ограничения для отдельных куч объектов, этот параметр игнорируется.

  • Значение по умолчанию, которое применяется только в определенных случаях, превышает 20 МБ или 75 % предельного объема памяти в контейнере. Значение по умолчанию применяется, если:

    • процесс выполняется в контейнере с заданным предельным объемом памяти;
    • параметр System.GC.HeapHardLimit не задан.
Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.HeapHardLimitPercent Десятичное значение .NET Core 3.0
Переменная среды COMPlus_GCHeapHardLimitPercent Шестнадцатеричное значение .NET Core 3.0
Переменная среды DOTNET_GCHeapHardLimitPercent Шестнадцатеричное значение .NET 6

Пример.

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.HeapHardLimitPercent": 30
      }
   }
}

Совет

Если вы задаете параметр в runtimeconfig.json, укажите десятичное значение. Если вы задаете параметр в виде переменной среды, укажите шестнадцатеричное значение. Например, чтобы ограничить использование кучи значением 30 %, для JSON-файла нужно указать 30, а для переменной среды — 0x1E или 1E.

Ограничения для отдельных куч объектов

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

  • Если задано значение любого из этих параметров (DOTNET_GCHeapHardLimitSOH, DOTNET_GCHeapHardLimitLOH или DOTNET_GCHeapHardLimitPOH), также необходимо указать значения DOTNET_GCHeapHardLimitSOH и DOTNET_GCHeapHardLimitLOH. Если этого не сделать, во время выполнения произойдет сбой инициализации.
  • Значение по умолчанию для DOTNET_GCHeapHardLimitPOH равно 0. Параметры DOTNET_GCHeapHardLimitSOH и DOTNET_GCHeapHardLimitLOH не имеют значений по умолчанию.
Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.HeapHardLimitSOH Десятичное значение .NET 5
Переменная среды COMPlus_GCHeapHardLimitSOH Шестнадцатеричное значение .NET 5
Переменная среды DOTNET_GCHeapHardLimitSOH Шестнадцатеричное значение .NET 6
Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.HeapHardLimitLOH Десятичное значение .NET 5
Переменная среды COMPlus_GCHeapHardLimitLOH Шестнадцатеричное значение .NET 5
Переменная среды DOTNET_GCHeapHardLimitLOH Шестнадцатеричное значение .NET 6
Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.HeapHardLimitPOH Десятичное значение .NET 5
Переменная среды COMPlus_GCHeapHardLimitPOH Шестнадцатеричное значение .NET 5
Переменная среды DOTNET_GCHeapHardLimitPOH Шестнадцатеричное значение .NET 6

Совет

Если вы задаете параметр в runtimeconfig.json, укажите десятичное значение. Если вы задаете параметр в виде переменной среды, укажите шестнадцатеричное значение. Например, чтобы задать для куч жесткое ограничение в 200 мебибайт (Миб), для JSON-файла нужно указать значение 209715200, а для переменной среды — значение 0xC800000 или C800000.

Ограничения для отдельных куч объектов в процентах

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

  • Если задано значение любого из этих параметров (DOTNET_GCHeapHardLimitSOHPercent, DOTNET_GCHeapHardLimitLOHPercent или DOTNET_GCHeapHardLimitPOHPercent), также необходимо указать значения DOTNET_GCHeapHardLimitSOHPercent и DOTNET_GCHeapHardLimitLOHPercent. Если этого не сделать, во время выполнения произойдет сбой инициализации.
  • Эти параметры игнорируются, если заданы значения параметров DOTNET_GCHeapHardLimitSOH, DOTNET_GCHeapHardLimitLOH и DOTNET_GCHeapHardLimitPOH.
  • Значение 1 означает, что при сборке мусора используется 1 % от общего объема физической памяти для соответствующей кучи объектов.
  • Задаваемое значение должно быть больше нуля и меньше 100. Кроме того, сумма всех трех процентных значений должна быть меньше 100. В противном случае во время выполнения произойдет сбой инициализации.
Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.HeapHardLimitSOHPercent Десятичное значение .NET 5
Переменная среды COMPlus_GCHeapHardLimitSOHPercent Шестнадцатеричное значение .NET 5
Переменная среды DOTNET_GCHeapHardLimitSOHPercent Шестнадцатеричное значение .NET 6
Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.HeapHardLimitLOHPercent Десятичное значение .NET 5
Переменная среды COMPlus_GCHeapHardLimitLOHPercent Шестнадцатеричное значение .NET 5
Переменная среды DOTNET_GCHeapHardLimitLOHPercent Шестнадцатеричное значение .NET 6
Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.HeapHardLimitPOHPercent Десятичное значение .NET 5
Переменная среды COMPlus_GCHeapHardLimitPOHPercent Шестнадцатеричное значение .NET 5
Переменная среды DOTNET_GCHeapHardLimitPOHPercent Шестнадцатеричное значение .NET 6

Совет

Если вы задаете параметр в runtimeconfig.json, укажите десятичное значение. Если вы задаете параметр в виде переменной среды, укажите шестнадцатеричное значение. Например, чтобы ограничить использование кучи значением 30 %, для JSON-файла нужно указать 30, а для переменной среды — 0x1E или 1E.

Потребление большого объема памяти в процентах

Потребление памяти обозначается в процентах использования физической памяти. По умолчанию, когда использование физической памяти достигает 90 % , сборка мусора начинает работать активнее и становится более компактной, чтобы избежать подкачки. Пока загрузка памяти составляет менее 90 %, сборщик мусора вместо фоновых выполняет полные сборки мусора, паузы при которых короче, зато общий размер кучи намного сокращается. На компьютерах с большим объемом памяти (80 ГБ или более) порог загрузки по умолчанию составляет от 90 до 97 %.

Максимальное пороговое значение загрузки памяти можно изменить с помощью DOTNET_GCHighMemPercent переменной среды или параметра конфигурации JSON System.GC.HighMemoryPercent. Чтобы изменить размер кучи, скорректируйте пороговое значение. Например, если основной процесс выполняется на компьютере с 64 ГБ памяти, будет разумно, чтобы сборщик мусора начинал реагировать, когда доступной памяти становится 10 %. А вот при небольших процессах, например, когда процесс задействует только 1 ГБ памяти, сборщик мусора может комфортно работать, даже если доступной памяти меньше 10 %. Для таких небольших процессов можно устанавливать более высокое пороговое значение. С другой стороны, если вы хотите уменьшить размер кучи для процессов побольше (даже при достаточном объеме физической памяти), уменьшите это пороговое значение, чтобы сборщик мусора начинал сжимать кучу раньше.

Примечание

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

Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.HighMemoryPercent Десятичное значение .NET 5
Переменная среды COMPlus_GCHighMemPercent Шестнадцатеричное значение .NET Core 3.0
.NET Framework 4.7.2
Переменная среды DOTNET_GCHighMemPercent Шестнадцатеричное значение .NET 6

Совет

Если вы задаете параметр в runtimeconfig.json, укажите десятичное значение. Если вы задаете параметр в виде переменной среды, укажите шестнадцатеричное значение. Например, чтобы задать пороговое значение загрузки памяти в 75 %, для JSON-файла нужно указать значение 75, а для переменной среды — 0x4B или 4B.

Сохранение виртуальной машины

  • Настраивает, будут ли удаляемые сегменты помещаться в список ожидания для будущего использования или возвращаться операционной системе (ОС).
  • По умолчанию: возвращение сегментов операционной системе. Это эквивалентно присвоению значения false.
Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.RetainVM false — возвращение операционной системе
true — помещение в режим ожидания
.NET Core 1.0
Свойство MSBuild RetainVMGarbageCollection false — возвращение операционной системе
true — помещение в режим ожидания
.NET Core 1.0
Переменная среды COMPlus_GCRetainVM 0 — возвращение операционной системе
1 — помещение в режим ожидания
.NET Core 1.0
Переменная среды DOTNET_GCRetainVM 0 — возвращение операционной системе
1 — помещение в режим ожидания
.NET 6

Примеры

Файл runtimeconfig.json

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.RetainVM": true
      }
   }
}

Файл проекта:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <RetainVMGarbageCollection>true</RetainVMGarbageCollection>
  </PropertyGroup>

</Project>

Большие страницы

  • Указывает, следует ли использовать большие страницы, когда задано жесткое ограничение куч.
  • По умолчанию: не следует использовать большие страницы, если задан фиксированный предел кучи. Это эквивалентно присвоению значения 0.
  • Это экспериментальный параметр.
Имя параметра Значения Представленная версия
runtimeconfig.json Н/Д Н/Д Н/Д
Переменная среды COMPlus_GCLargePages 0 — отключено
1 — включено
.NET Core 3.0
Переменная среды DOTNET_GCLargePages 0 — отключено
1 — включено
.NET 6

Разрешить большие объекты

  • Настраивает для сборщика мусора на 64-разрядных платформах поддержку массивов, размер которых превышает 2 гигабайта (ГБ).
  • По умолчанию: сборка мусора поддерживает массивы размером более 2 ГБ. Это эквивалентно присвоению значения 1.
  • В будущей версии .NET этот параметр может быть объявлен устаревшим.
Имя параметра Значения Представленная версия
runtimeconfig.json Н/Д Н/Д Н/Д
Переменная среды COMPlus_gcAllowVeryLargeObjects 1 — включено
0 — отключено
.NET Core 1.0
Переменная среды DOTNET_gcAllowVeryLargeObjects 1 — включено
0 — отключено
.NET 6
app.config для .NET Framework gcAllowVeryLargeObjects 1 — включено
0 — отключено
.NET Framework 4,5

Пороговое значение кучи больших объектов

  • Указывает пороговый размер (в байтах), при котором объекты попадают в кучу больших объектов (LOH).
  • Пороговое значение по умолчанию — 85 000 байт.
  • Указанное значение должно быть больше порогового значения по умолчанию.
Имя параметра Значения Представленная версия
runtimeconfig.json System.GC.LOHThreshold Десятичное значение .NET Core 1.0
Переменная среды COMPlus_GCLOHThreshold Шестнадцатеричное значение .NET Core 1.0
Переменная среды DOTNET_GCLOHThreshold Шестнадцатеричное значение .NET 6
app.config для .NET Framework GCLOHThreshold Десятичное значение .NET Framework 4.8

Пример.

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.LOHThreshold": 120000
      }
   }
}

Совет

Если вы задаете параметр в runtimeconfig.json, укажите десятичное значение. Если вы задаете параметр в виде переменной среды, укажите шестнадцатеричное значение. Например, чтобы задать порог размера в 120 000 байт, для JSON-файла нужно указать значение 120000, а для переменной среды — значение 0x1D4C0 или 1D4C0.

Автономный сборщик мусора

Имя параметра Значения Представленная версия
runtimeconfig.json Н/Д Н/Д Н/Д
Переменная среды COMPlus_GCName string_path .NET Core 2.0;
Переменная среды DOTNET_GCName string_path .NET 6