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


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

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

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

Примечание.

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

Способы указания конфигурации

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

Расположение конфигурации Версии .NET, к этим расположениям относятся Список типов Как он интерпретируется
файл runtimeconfig.json/
runtimeconfig.template.json
.NET (Core) n n интерпретируется как десятичное значение.
Переменная среды платформа .NET Framework, .NET (Core) 0xn или n n интерпретируется как шестнадцатеричное значение в любом формате
Файл app.config .NET Framework 0xn n интерпретируется как шестнадцатеричное значение1

1 Можно указать значение без 0x префикса для параметра файла app.config, но не рекомендуется. В платформа .NET Framework 4.8+ из-за ошибки значение, указанное без 0x префикса, интерпретируется как шестнадцатеричное, но в предыдущих версиях платформа .NET Framework оно интерпретируется как десятичное. Чтобы избежать необходимости изменять конфигурацию, используйте 0x префикс при указании значения в файле app.config.

Например, чтобы указать 12 куч для GCHeapCount приложения платформа .NET Framework с именем A.exe, добавьте следующий XML-файл в файл конфигурации A.exe.config.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    ...
    <runtime>
        <gcServer enabled="true"/>
        <GCHeapCount>0xc</GCHeapCount>
    </runtime>
</configuration>

Для .NET (Core) и платформа .NET Framework можно использовать переменные среды.

В Windows с помощью .NET 6 или более поздней версии:

SET DOTNET_gcServer=1
SET DOTNET_GCHeapCount=c

В Windows с помощью .NET 5 или более ранней версии:

SET COMPlus_gcServer=1
SET COMPlus_GCHeapCount=c

В других операционных системах:

Для .NET 6 или более поздних версий:

export DOTNET_gcServer=1
export DOTNET_GCHeapCount=c

Для .NET 5 и более ранних версий:

export COMPlus_gcServer=1
export COMPlus_GCHeapCount=c

Если вы не используете платформа .NET Framework, можно также задать значение в файле runtimeconfig.json или runtimeconfig.template.json.

Файл runtimeconfig.json

{
  "runtimeOptions": {
   "configProperties": {
      "System.GC.Server": true,
      "System.GC.HeapCount": 12
   }
  }
}

файл runtimeconfig.template.json:

{
  "configProperties": {
    "System.GC.Server": true,
    "System.GC.HeapCount": 12
  }
}

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

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

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

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

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

  • Указывает, использует ли приложение сборку мусора рабочей станции или сборку мусора сервера.
  • По умолчанию: сборка мусора рабочей станции. Это эквивалентно присвоению значения 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
      }
   }
}

файл runtimeconfig.template.json:

{
   "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
      }
   }
}

файл runtimeconfig.template.json:

{
   "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

Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.

Примеры

Файл runtimeconfig.json

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

файл runtimeconfig.template.json:

{
   "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

Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.

Примеры

Файл runtimeconfig.json

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

файл runtimeconfig.template.json:

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

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

  • Указывает список процессоров, используемых для потоков сборщика мусора.
  • Этот параметр аналогичен System.GC.HeapAffinitizeMask, за исключением того, что он позволяет указать больше 64 процессоров.
  • Для операционных систем Windows префикс номера процессора или диапазона с соответствующей группой ЦП, например "0:1-10,0:12,12,1:50-52,1:7". Если у вас нет более 1 группы ЦП, этот параметр нельзя использовать. Необходимо использовать параметр маски affinitize. И указанные числа находятся в этой группе, что означает, что оно не может быть >= 64.
  • Для операционных систем Linux, где концепция группы ЦП не существует, можно использовать этот параметр и параметр маски Affinitize, чтобы указать одинаковые диапазоны. Вместо "0:1-10" укажите "1-10", так как не нужно указывать индекс группы.
  • Если сходство процессоров отключено, этот параметр игнорируется.
  • Применяется только к сборке мусора сервера.
  • Дополнительные сведения см. в разделе "Улучшение конфигурации ЦП для GC на компьютерах с > 64 ЦП в блоге Maoni Stephens".
Имя настройки Значения Представленные версии
runtimeconfig.json System.GC.HeapAffinitizeRanges Разделенный запятыми список номеров процессоров или диапазонов номеров процессоров.
Пример Unix: "1-10,12,50-52,70"
Пример Windows: "0:1-10,0:12,1:50-52,1:7"
.NET Core 3.0
Переменная среды COMPlus_GCHeapAffinitizeRanges Разделенный запятыми список номеров процессоров или диапазонов номеров процессоров.
Пример Unix: "1-10,12,50-52,70"
Пример Windows: "0:1-10,0:12,1:50-52,1:7"
.NET Core 3.0
Переменная среды DOTNET_GCHeapAffinitizeRanges Разделенный запятыми список номеров процессоров или диапазонов номеров процессоров.
Пример Unix: "1-10,12,50-52,70"
Пример Windows: "0:1-10,0:12,1:50-52,1:7"
.NET 6

Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.

Примеры

Файл runtimeconfig.json

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

файл runtimeconfig.template.json:

{
   "configProperties": {
      "System.GC.HeapAffinitizeRanges": "0:1-10,0:12,1:50-52,1:7"
   }
}

Группы ЦП

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

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

    Примечание.

    Это концепция только для Windows. В более ранних версиях Windows Windows ограничивается процессом одной группы ЦП. Таким образом, GC использовал только одну группу ЦП, если этот параметр не использовался для включения нескольких групп ЦП. Это ограничение ОС было отменено в Windows 11 и Server 2022. Кроме того, начиная с .NET 7, GC по умолчанию использует все группы ЦП при работе в Windows 11 или Server 2022.

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

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

  • Дополнительные сведения см. в разделе "Улучшение конфигурации ЦП для GC на компьютерах с > 64 ЦП в блоге Maoni Stephens".

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

Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.

Примечание.

Чтобы настроить среду 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

Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.

Примеры

Файл runtimeconfig.json

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

файл runtimeconfig.template.json:

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

Кучи жесткого ограничения

  • Жесткое ограничение кучи определяется как максимальный размер фиксации (в байтах) для кучи GC и GC.
  • Этот параметр применим только к 64-разрядным компьютерам.
  • Если это ограничение не настроено, но процесс выполняется в ограниченной памяти среде, то есть внутри контейнера с указанным ограничением памяти, устанавливается значение по умолчанию. Это значение по умолчанию больше 20 МБ или 75 % объема памяти в контейнере.
  • Этот параметр игнорируется, если настроены жесткие ограничения per-object-heap.
Имя настройки Значения Представленные версии
runtimeconfig.json System.GC.HeapHardLimit Десятичное значение .NET Core 3.0
Переменная среды COMPlus_GCHeapHardLimit Шестнадцатеричное значение .NET Core 3.0
Переменная среды DOTNET_GCHeapHardLimit Шестнадцатеричное значение .NET 6

Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.

Примеры

Файл runtimeconfig.json

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

файл runtimeconfig.template.json:

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

Совет

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

Процент жесткого ограничения кучи

  • Указывает жесткое ограничение кучи в процентах от общего объема физической памяти. Если процесс выполняется в ограниченной памяти среде, то есть внутри контейнера с заданным ограничением памяти, общая физическая память — это ограничение памяти; в противном случае это то, что доступно на компьютере.
  • Этот параметр применим только к 64-разрядным компьютерам.
  • Этот параметр игнорируется, если жесткие ограничения для кучи для объекта настроены или настроено жесткое ограничение кучи.
Имя настройки Значения Представленные версии
runtimeconfig.json System.GC.HeapHardLimitPercent Десятичное значение .NET Core 3.0
Переменная среды COMPlus_GCHeapHardLimitPercent Шестнадцатеричное значение .NET Core 3.0
Переменная среды DOTNET_GCHeapHardLimitPercent Шестнадцатеричное значение .NET 6

Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.

Примеры

Файл runtimeconfig.json

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

файл runtimeconfig.template.json:

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

Совет

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

Жесткие ограничения для кучи для каждого объекта

Можно указать жесткое ограничение кучи GC на основе кучи для каждого объекта. Это можно сделать для кучи больших (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

Эти параметры конфигурации не имеют определенных свойств MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.

Совет

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

Проценты жесткого ограничения на единицу объекта

Можно указать жесткое ограничение кучи GC на основе кучи для каждого объекта. Это можно сделать для кучи больших (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

Эти параметры конфигурации не имеют определенных свойств MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.

Совет

Если вы задаете параметр в 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

Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.

Совет

Если вы задаете параметр в 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
      }
   }
}

файл runtimeconfig.template.json:

{
   "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 гигабайта (ГБ).
  • По умолчанию: GC поддерживает массивы размером более 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 байт.
  • Указанное значение должно быть больше порогового значения по умолчанию.
  • Значение может быть ограничено средой выполнения до максимального возможного размера текущей конфигурации. Вы можете проверить значение, используемое во время выполнения через GC.GetConfigurationVariables() API.
Имя настройки Значения Представленные версии
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

Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.

Примеры

Файл runtimeconfig.json

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

файл runtimeconfig.template.json:

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

Совет

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

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

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

Путь

  • Указывает полный путь к собственной библиотеке GC, которую среда выполнения загружает вместо реализации GC по умолчанию. Чтобы обеспечить безопасность, это расположение должно быть защищено от потенциально вредоносного изменения.
Имя настройки Значения Представленные версии
runtimeconfig.json System.GC.Path string_path .NET 9
Переменная среды DOTNET_GCPath string_path .NET 9

Имя.

  • Указывает имя собственной библиотеки GC, которую среда выполнения загружает вместо реализации GC по умолчанию. Поведение изменилось в .NET 9 с введением конфигурации пути .

    В .NET 8 и предыдущих версиях:

    • Если указано только имя библиотеки, библиотека должна находиться в том же каталоге, что и среда выполнения .NET (coreclr.dll в Windows, libcoreclr.so в Linux или libcoreclr.dylib в OSX).
    • Значение также может быть относительным путем, например, если указать ".. \clrgc.dll" в Windows clrgc.dll загружается из родительского каталога каталога среды выполнения .NET.

    В .NET 9 и более поздних версиях это значение указывает только имя файла (пути не допускаются):

    • .NET ищет имя, указанное в каталоге, где находится сборка, содержащая метод приложения Main .
    • Если файл не найден, выполняется поиск в каталоге среды выполнения .NET.
  • Этот параметр конфигурации игнорируется, если указана конфигурация пути .

Имя настройки Значения Представленные версии
runtimeconfig.json System.GC.Name string_name .NET 7
Переменная среды COMPlus_GCName string_name .NET Core 2.0;
Переменная среды DOTNET_GCName string_name .NET 6

Сохранение памяти

  • Настраивает сборщик мусора для экономии памяти за счет более частых сборок мусора и, возможно, более длительного времени приостановки.
  • Значение по умолчанию равно 0. Это означает, что изменения не изменяются.
  • Помимо значения по умолчанию 0, допустимы значения от 1 до 9 (включительно). Чем выше значение, тем больше сборщик мусора пытается сохранить память и таким образом сохранить кучу небольшой.
  • Если значение не равно нулю, куча больших объектов будет сжиматься автоматически, если она имеет слишком много фрагментации.
Имя настройки Значения Представленные версии
runtimeconfig.json System.GC.ConserveMemory 0 - 9 .NET 6
Переменная среды COMPlus_GCConserveMemory 0 -9 .NET Framework 4.8
Переменная среды DOTNET_GCConserveMemory 0 -9 .NET 6
app.config для .NET Framework GCConserveMemory 0 -9 .NET Framework 4.8

Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.

Пример файла app.config :


<configuration>
  <runtime>
    <GCConserveMemory enabled="5"/>
  </runtime>
</configuration>

Совет

Поэкспериментируйте с разными числами, чтобы узнать, какое значение лучше всего подходит для вас. Начните со значения от 5 до 7.

Динамическая адаптация к размерам приложений (DATAS)

  • Настраивает сборщик мусора для использования DATAS. DATAS адаптируется к требованиям к памяти приложения, что означает, что размер кучи приложения должен быть примерно пропорциональным размеру данных длительного времени.
  • Включен по умолчанию, начиная с .NET 9.
Имя настройки Значения Представленные версии
Переменная среды DOTNET_GCDynamicAdaptationMode 1 — включено
0 — отключено
.NET 8
Свойство MSBuild GarbageCollectionAdaptationMode 1 — включено
0 — отключено
.NET 8
runtimeconfig.json System.GC.DynamicAdaptationMode 1 — включено
0 — отключено
.NET 8

Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.