Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
На этой странице содержатся сведения о параметрах сборщика мусора среды выполнения .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 интерпретируется как десятичное значение. |
| Переменная среды | .NET Framework, .NET | 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
В других операционных системах с помощью .NET 6 или более поздней версии:
export DOTNET_gcServer=1
export DOTNET_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 |
| Переменная среды | 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 |
| Переменная среды | 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>
Автономный сборщик мусора
Чтобы использовать автономный сборщик мусора вместо реализации 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 |
| Переменная среды | DOTNET_GCName |
string_name | .NET 6 |
Определенные параметры loH
Разрешить очень большие объекты
- Настраивает для сборщика мусора на 64-разрядных платформах поддержку массивов, размер которых превышает 2 гигабайта (ГБ).
- По умолчанию: GC поддерживает массивы размером более 2 ГБ. Это эквивалентно присвоению значения
1. - В будущей версии .NET этот параметр может быть объявлен устаревшим.
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | Неприменимо | Неприменимо | Неприменимо |
| Переменная среды | 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 3.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
Следующие параметры применяются ко всем вкусам GC:
- Кучи жесткого ограничения
- Процент жесткого ограничения кучи
- Жесткие ограничения для кучи для каждого объекта
- Проценты жесткого ограничения на единицу объекта
- Большие страницы
- Диапазон регионов
- Размер региона
- Потребление большого объема памяти в процентах
- Сохранение виртуальной машины
- Сохранение памяти
Кучи жесткого ограничения
- Жесткое ограничение кучи определяется как максимальный размер фиксации (в байтах) для кучи GC и GC.
- Этот параметр применим только к 64-разрядным компьютерам.
- Если выполняется в среде, ограниченной памятью (например, контейнер) и это значение не задано, значение по умолчанию равно 20 МБ или кучи жесткого ограничения в процентах от предела контейнера, в зависимости от того, какой из них больше.
- Этот параметр игнорируется, если настроены жесткие ограничения per-object-heap.
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | System.GC.HeapHardLimit |
Десятичное значение | .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.
Процент жесткого ограничения кучи
- Указывает жесткое ограничение кучи в процентах от общего объема физической памяти.
- Если процесс выполняется в среде с заданным ограничением памяти (например, контейнером), это ограничение обрабатывается как общая физическая память. В таких средах значение по умолчанию равно 75%.
- Этот параметр применим только к 64-разрядным компьютерам.
- Этот параметр игнорируется, если жесткие ограничения для кучи для объекта настроены или настроено жесткое ограничение кучи.
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | System.GC.HeapHardLimitPercent |
Десятичное значение | .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 |
| Переменная среды | DOTNET_GCHeapHardLimitSOH |
Шестнадцатеричное значение | .NET 6 |
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | System.GC.HeapHardLimitLOH |
Десятичное значение | .NET 5 |
| Переменная среды | DOTNET_GCHeapHardLimitLOH |
Шестнадцатеричное значение | .NET 6 |
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | System.GC.HeapHardLimitPOH |
Десятичное значение | .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 |
| Переменная среды | DOTNET_GCHeapHardLimitSOHPercent |
Шестнадцатеричное значение | .NET 6 |
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | System.GC.HeapHardLimitLOHPercent |
Десятичное значение | .NET 5 |
| Переменная среды | DOTNET_GCHeapHardLimitLOHPercent |
Шестнадцатеричное значение | .NET 6 |
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | System.GC.HeapHardLimitPOHPercent |
Десятичное значение | .NET 5 |
| Переменная среды | DOTNET_GCHeapHardLimitPOHPercent |
Шестнадцатеричное значение | .NET 6 |
Эти параметры конфигурации не имеют определенных свойств MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild.
Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.
Совет
Если вы задаете параметр в runtimeconfig.json, укажите десятичное значение. Если вы задаете параметр в виде переменной среды, укажите шестнадцатеричное значение. Например, чтобы ограничить использование кучи значением 30 %, для JSON-файла нужно указать 30, а для переменной среды — 0x1E или 1E.
Большие страницы
- Указывает, следует ли использовать большие страницы, когда задано жесткое ограничение куч.
- По умолчанию: не используйте большие страницы при установке жесткого ограничения кучи. Это эквивалентно присвоению значения
0. - Это экспериментальный параметр.
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | Неприменимо | Неприменимо | Неприменимо |
| Переменная среды | DOTNET_GCLargePages |
0 — отключено1 — включено |
.NET 6 |
Диапазон регионов
Начиная с .NET 7 куча GC переключила свое физическое представление из сегментов в регионы для 64-разрядной ос Windows и Linux. (Дополнительные сведения см. в блоге Маони Стивенса.) При этом изменении GC резервирует диапазон виртуальной памяти во время инициализации. Обратите внимание, что это только резервирование памяти, а не фиксация (размер кучи GC фиксируется в памяти). Это просто диапазон, определяющий максимальный диапазон кучи GC, который может зафиксировать. Большинству приложений не нужно фиксировать почти так много.
Если у вас нет других конфигураций и не выполняется в ограниченной памяти среде (что приведет к настройке некоторых конфигураций GC), по умолчанию зарезервировано 256 ГБ. Если доступно более 256 ГБ физической памяти, это будет в два раза больше.
Если заданы жесткие ограничения на кучу, диапазон резерва совпадает с общим жестким ограничением. Если задана одна конфигурация жесткого ограничения, этот диапазон составляет пять раз.
Этот диапазон ограничен объемом общей виртуальной памяти. Обычно на 64-разрядной версии это никогда не проблема, но в процессе может быть установлено ограничение виртуальной памяти. Этот диапазон ограничен на половину этой суммы. Например, если для конфигурации задано HeapHardLimit значение 1 ГБ и задано ограничение виртуальной памяти на 4 ГБ в процессе, этот диапазон равен min (5x1GB, 4GB/2)2 ГБ.
Api можно использовать GC.GetConfigurationVariables() для просмотра значения этого диапазона под именем GCRegionRange. Если вы получаете E_OUTOFMEMORY во время инициализации среды выполнения и хотите узнать, является ли это из-за резервирования этого диапазона, просмотрите VirtualAlloc вызов с MEM_RESERVE Windows или mmap вызов с PROT_NONE linux во время инициализации GC и проверьте, находится ли OOM из этого вызова. Если этот резервный вызов завершается сбоем, его можно изменить с помощью следующих параметров конфигурации. Рекомендация по количеству резервирования составляет два–пять раз, чем размер фиксации для кучи GC. Если сценарий не делает большое количество выделений (это может быть любое выделение в UOH или больше размера региона UOH), дважды зафиксированный размер должен быть безопасным. В противном случае может потребоваться сделать его более большим, чтобы вы не влечете слишком частого полного сжатия GCs, чтобы сделать пространство для этих больших регионов. Если вы не знаете размер фиксации кучи GC, можно задать это значение в два раза больше физической памяти, доступной для вашего процесса.
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | System.GC.RegionRange |
Десятичное значение | .NET 10 |
| Переменная среды | DOTNET_GCRegionRange |
Шестнадцатеричное значение | .NET 7 |
Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild.
Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.
Размер региона
Начиная с .NET 7 куча GC переключила свое физическое представление из сегментов в регионы для 64-разрядной Ос Windows и Linux. (Дополнительные сведения см. в блоге Маони Стивенса.) По умолчанию каждый регион составляет 4 МБ для SOH. Для UOH (LOH и POH) это восемь раз больше размера региона SOH. Эту конфигурацию можно использовать для изменения размера региона SOH, а регионы UOH будут скорректированы соответствующим образом.
Регионы выделяются только при необходимости, поэтому в целом вам не нужно беспокоиться о размере региона. Однако существует два случая, когда может потребоваться изменить этот размер:
- Для процессов, которые имеют очень небольшие кучи GC, изменение размера региона на меньшее полезно для использования собственной памяти из собственной книги GC. Рекомендация составляет 1 МБ.
- В Linux, если необходимо уменьшить количество сопоставлений памяти, можно изменить размер региона, например 32 МБ.
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | System.GC.RegionSize |
Десятичное значение | .NET 10 |
| Переменная среды | DOTNET_GCRegionSize |
Шестнадцатеричное значение | .NET 7 |
Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild.
Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.
Потребление большого объема памяти в процентах
Потребление памяти обозначается в процентах использования физической памяти. По умолчанию, когда использование физической памяти достигает 90 %, сборка мусора начинает работать активнее и становится более компактной, чтобы избежать подкачки. Пока загрузка памяти составляет менее 90 %, сборщик мусора вместо фоновых выполняет полные сборки мусора, паузы при которых короче, зато общий размер кучи намного сокращается. На компьютерах с большим объемом памяти (80 ГБ или более) порог загрузки по умолчанию составляет от 90 до 97 %.
Максимальное пороговое значение загрузки памяти можно изменить с помощью DOTNET_GCHighMemPercent переменной среды или параметра конфигурации JSON System.GC.HighMemoryPercent. Чтобы изменить размер кучи, скорректируйте пороговое значение. Например, если основной процесс выполняется на компьютере с 64 ГБ памяти, будет разумно, чтобы сборщик мусора начинал реагировать, когда доступной памяти становится 10 %. А вот при небольших процессах, например, когда процесс задействует только 1 ГБ памяти, сборщик мусора может комфортно работать, даже если доступной памяти меньше 10 %. Для таких небольших процессов можно устанавливать более высокое пороговое значение. С другой стороны, если вы хотите уменьшить размер кучи для процессов побольше (даже при достаточном объеме физической памяти), уменьшите это пороговое значение, чтобы сборщик мусора начинал сжимать кучу раньше.
Примечание.
Для процессов, выполняемых в контейнере, сборщик мусора считает физическую память, исходя из ограничения контейнера.
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | System.GC.HighMemoryPercent |
Десятичное значение | .NET 5 |
| Переменная среды | 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 |
| Переменная среды | 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. Это означает, что изменения не изменяются.
- Помимо значения по умолчанию 0, допустимы значения от 1 до 9 (включительно). Чем выше значение, тем больше сборщик мусора пытается сохранить память и таким образом сохранить кучу небольшой.
- Если значение не равно нулю, куча больших объектов будет сжиматься автоматически, если она имеет слишком много фрагментации.
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | System.GC.ConserveMemory |
0 - 9 |
.NET 6 |
| Переменная среды | 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.
Управление использованием ресурсов для сервера GC
Следующие параметры влияют на количество потоков GC сервера и как они сопоставлены с ядрами. Они не влияют на GC рабочей станции.
Дополнительные сведения о первых 3 параметрах см. в разделе "Средний" между рабочей станцией и записью блога GC сервера.
Число куч
- Ограничивает число куч, создаваемых сборщиком мусора.
- Применяется только к сборке мусора сервера.
- Если включено сходство процессоров сборки мусора, что используется по умолчанию, параметр счетчика куч реализует сходство
nкуч/потоков сборки мусора с первымиnпроцессорами. (Используйте параметры сходства маски или сходства диапазонов, чтобы указать, для каких именно процессоров следует реализовать сходство.) - Если сходство процессоров сборки мусора отключено, этот параметр будет ограничивать количество куч сборки мусора.
- Дополнительные сведения см. в примечаниях по GCHeapCount.
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | System.GC.HeapCount |
Десятичное значение | .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.
Сходство
- Указывает, следует ли реализовать сходство потоков сборки мусора с процессорами. Реализация сходства потока сборки мусора означает, что он может выполняться только на определенном ЦП. Куча создается для каждого потока сборки мусора.
- Применяется только к сборке мусора сервера.
- По умолчанию: сопоставление потоков сборки мусора с процессорами. Это эквивалентно присвоению значения
false.
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | System.GC.NoAffinitize |
false — реализовать сходствоtrue — не реализовывать сходство |
.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
}
}
Сходство маски
- Указывает конкретные процессоры, которые должны использоваться потоками сборщика мусора.
- Если сходство процессоров отключено, этот параметр игнорируется.
- Применяется только к сборке мусора сервера.
- Это значение представляет собой битовую маску, которая определяет доступные процессу процессоры. Например, десятичное значение 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 |
| Переменная среды | 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 |
| Переменная среды | 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 |
| Переменная среды | 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.
Динамическая адаптация к размерам приложений (DATAS)
Включение или отключение 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 |
Целевой TCP
DATAS использует процент затрат на пропускную способность (TCP) в качестве измерения затрат памяти на пропускную способность. Следует учитывать приостановку GC и сколько выделений приходится ждать. Как правило, GC приостанавливается доминирует, поэтому вы можете использовать "% приостановку времени в GC" для приближения этой стоимости. Существует два временных случая, когда время ожидания выделения может доминировать:
- При запуске процесса DATAS всегда начинается с одной кучы. Таким образом, если есть достаточно потоков выделения, они испытывают ожидания.
- Когда рабочая нагрузка изменяется с более легкого на более тяжелый, например при запуске пиковых часов, выделение потоков может возникать в течение этого периода времени. Это связано с тем, что он принимает несколько GCs, прежде чем число кучи увеличивается.
DATAS использует 2% в качестве TCP по умолчанию, который можно настроить с помощью этого параметра. Это целое число, интерпретируемое как процент, например, 5 означает, что целевой TCP будет 5%.
| Имя настройки | Значения | Представленные версии | |
|---|---|---|---|
| runtimeconfig.json | System.GC.DTargetTCP |
Десятичное значение | .NET 9 |
| Переменная среды | DOTNET_GCDTargetTCP |
Шестнадцатеричное значение | .NET 9 |
Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить RuntimeHostConfigurationOption элемент MSBuild.
Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.
Параметры бюджета 0-го поколения
Настройка бюджета 0-го поколения является одним из ключевых элементов DATAS, которые используются для адаптации к размерам приложений. DATAS определяет верхний порог, называемый BCD (бюджет вычисляется с помощью DATAS) для общего бюджета 0-го поколения в качестве функции размера приложения. Формула для вычисления умножения выглядит следующим образом:
$$ f(\text{application_size_in_MB}) = \frac{20 - \text{conserve_memory}}{\sqrt{\text{application_size_in_MB}}} $$
Затем формула зацепляется максимальным и минимальным значением перед применением к размеру приложения в МБ. Если параметр экономии памяти не указан, DATAS по умолчанию использует 5. Максимальное и минимальное значение по умолчанию равно 10 и 0,1 соответственно.
Например, если размер приложения составляет 1 ГБ, формула вычисляется (20 - 5) / sqrt (1000) = 0.474. Так как это от 10 до 0,1, зажим не имеет никакого эффекта. Это означает, что общий бюджет поколения составляет 47,4% 1 ГБ, что составляет 474 МБ. Если размер приложения равен 1 МБ, формула вычислит 15, которая затем будет скорректирована до 10, то есть общий бюджет 0-го поколения составляет 10 МБ.
Три параметра предоставляются для настройки вычислений формулы и изменения значений закрепления:
Процент, который будет применен к вычисляемому
fобъекту.Имя настройки Значения Представленные версии runtimeconfig.json System.GC.DGen0GrowthPercentДесятичное значение .NET 10 Переменная среды DOTNET_GCDGen0GrowthPercentШестнадцатеричное значение .NET 10 Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить
RuntimeHostConfigurationOptionэлемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.Поэтому если
fвычисляется значение 0,474 и этот параметр равен 200, умножение становится0.474 * 200% = 0.948до применения закрепления.Максимальное значение зажимания в улыбке.
Имя настройки Значения Представленные версии runtimeconfig.json System.GC.DGen0GrowthMaxFactorДесятичное значение .NET 10 Переменная среды DOTNET_GCDGen0GrowthMaxFactorШестнадцатеричное значение .NET 10 Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить
RuntimeHostConfigurationOptionэлемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.Если это значение равно 20000, это означает, что максимальное значение зажимания равно
20000 * 0.001 = 20.Минимальное значение зажимания в улыбке.
Имя настройки Значения Представленные версии runtimeconfig.json System.GC.DGen0GrowthMinFactorДесятичное значение .NET 10 Переменная среды DOTNET_GCDGen0GrowthMinFactorШестнадцатеричное значение .NET 10 Этот параметр конфигурации не имеет определенного свойства MSBuild. Однако вместо этого можно добавить
RuntimeHostConfigurationOptionэлемент MSBuild. Используйте имя параметра runtimeconfig.json в качестве значения атрибутаInclude. Пример см. в свойствах MSBuild.Если это значение равно 200, минимальное значение зажимания равно
200 * 0.001 = 0.2.