用于垃圾回收的运行时配置选项

此页面包含有关 .NET 运行时垃圾回收器 (GC) 设置的信息。 如果你要尝试让正在运行的应用达到最佳性能,请考虑使用这些设置。 然而,在特定情况下,默认值为大多数应用程序提供最佳性能。

设置在此页上被排入组中。 每个组内的设置通常彼此结合使用以实现特定的结果。

注意

  • 这些设置也可以在应用运行时由应用动态地进行更改,因此,你设置的任何配置选项都可能会被覆盖。
  • 某些设置(如延迟级别)通常仅在设计时通过 API 进行设置。 此页面省略了此类设置。
  • 对于数值,请对 runtimeconfig.json 文件中的设置使用十进制表示法,而对环境变量设置使用十六进制表示法。 对于十六进制值,可以使用或不使用“0x”前缀来指定它们。
  • 如果使用环境变量,则 .NET 6 将标准化前缀 DOTNET_,而不是 COMPlus_。 但是,COMPlus_ 前缀仍将继续正常工作。 如果使用的是早期版本的 .NET 运行时,则仍应该使用 COMPlus_ 前缀,例如 COMPlus_gcServer

指定配置的方法

对于不同版本的 .NET 运行时,可采用不同的方法来指定配置值。 下表显示了相关摘要。

配置位置 此位置适用的 .NET 版本 格式 解释方式
runtimeconfig.json 文件 .NET Core n n 解释为十进制值。
环境变量 .NET Framework、.NET Core 0xn 或 n n 被解释为任一格式的十六进制值
app.config 文件 .NET Framework 0xn n 被解释为十六进制值1

1 可以为 app.config 文件设置指定不带 0x 前缀的值,但不建议这样做。 在 .NET Framework 4.8+ 上,由于出现了 bug,不带 0x 前缀的指定值被解释为十六进制值,但在以前的 .NET Framework 版本中,它被解释为十进制值。 若要避免更改配置,请在 app.config 文件中指定值时使用 0x 前缀。

例如,若要为名为“A.exe”的 .NET Framework 应用的 GCHeapCount 指定 12 个堆,请将下列 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 5 或更高版本:

SET DOTNET_gcServer=1
SET DOTNET_GCHeapCount=c

在 Windows 上使用 .NET Core 3.1 或更低版本:

SET COMPlus_gcServer=1
SET COMPlus_GCHeapCount=c

在其他操作系统上:

对于 .NET 5 或更高版本:

export DOTNET_gcServer=1
export DOTNET_GCHeapCount=c

对于 .NET Core 3.1 和更低版本:

export COMPlus_gcServer=1
export COMPlus_GCHeapCount=c

仅对于 .NET Core,可以在 runtimeconfig.json 文件中设置值。

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

垃圾回收的风格

垃圾回收的两种主要风格是工作站 GC 和服务器 GC。 有关两者之间的差异的详细信息,请参阅工作站和服务器垃圾回收

垃圾回收的次要风格是后台垃圾回收和非并发垃圾回收。

使用以下设置,选择垃圾回收的风格:

工作站与服务器

  • 配置应用程序是使用工作站垃圾回收还是服务器垃圾回收。
  • 默认:工作站垃圾回收。 它等效于将值设置为 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
.NET Framework 的 app.config 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 - 后台 GC
false - 非并发 GC
.NET Core 1.0
MSBuild 属性 ConcurrentGarbageCollection true - 后台 GC
false - 非并发 GC
.NET Core 1.0
环境变量 COMPlus_gcConcurrent 1 - 后台 GC
0 - 非并发 GC
.NET Core 1.0
环境变量 DOTNET_gcConcurrent 1 - 后台 GC
0 - 非并发 GC
.NET 6
.NET Framework 的 app.config gcConcurrent true - 后台 GC
false - 非并发 GC

示例

runtimeconfig.json 文件:

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

项目文件:

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

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

</Project>

管理资源使用情况

使用以下设置来管理垃圾回收器的内存和处理器使用情况:

有关其中某些设置的详细信息,请参阅 Middle ground between workstation and server GC(服务器和工作站 GC 之间的中间地带)博客条目。

堆计数

  • 限制通过垃圾回收器创建的堆数。
  • 仅适用于服务器垃圾回收。
  • 如果启用了默认的 GC 处理器关联,堆计数设置会将 n 个 GC 堆/线程关联到前 n 个处理器。 (使用关联掩码关联范围设置可精确指定要关联的处理器。)
  • 如果禁用了 GC 处理器关联,则此设置会限制 GC 堆的数量。
  • 有关详细信息,请参阅 GCHeapCount 备注
设置名 引入的版本
runtimeconfig.json System.GC.HeapCount 十进制值 .NET Core 3.0
环境变量 COMPlus_GCHeapCount 十六进制值 .NET Core 3.0
环境变量 DOTNET_GCHeapCount 十六进制值 .NET 6
.NET Framework 的 app.config GCHeapCount 十进制值 .NET Framework 4.6.2

示例:

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

提示

如果要在 runtimeconfig.template.json 中设置该选项,请指定一个十进制值。 如果要将选项设置为一个环境变量,请指定一个十六进制值。 例如,若要将堆数限制为 16,则该值对于 JSON 文件为 16,对于环境变量则为 0x10 或 10。

关联掩码

  • 指定垃圾回收器线程应使用的确切处理器数。
  • 如果禁用了 GC 处理器关联,则忽略此设置。
  • 仅适用于服务器垃圾回收。
  • 该值是一个位掩码,用于定义可用于该进程的处理器。 例如,十进制值 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
.NET Framework 的 app.config GCHeapAffinitizeMask 十进制值 .NET Framework 4.6.2

示例:

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

关联范围

设置名 引入的版本
runtimeconfig.json System.GC.HeapAffinitizeRanges 以逗号分隔的处理器编号列表或处理器编号范围。
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.HeapAffinitizeRanges": "0:1-10,0:12,1:50-52,1:70"
      }
   }
}

CPU 组

  • 配置垃圾回收器是否使用 CPU 组

    当 64 位 Windows 计算机具有多个 CPU 组(即,有超过 64 个处理器)时,通过启用此元素,可跨所有 CPU 组扩展垃圾回收。 垃圾回收器使用所有核心来创建和平衡堆。

  • 仅适用于 64 位 Windows 操作系统上的服务器垃圾回收。

  • 默认:垃圾回收不会跨 CPU 组扩展。 它等效于将值设置为 0

  • 有关详细信息,请参阅 Maoni Stephens 的博客文章:在 64 个以上 CPU 的计算机上为 GC 改善 CPU 配置

设置名 引入的版本
runtimeconfig.json System.GC.CpuGroup false - 禁用
true - 启用
.NET 5
环境变量 COMPlus_GCCpuGroup 0 - 禁用
1 - 启用
.NET Core 1.0
环境变量 DOTNET_GCCpuGroup 0 - 禁用
1 - 启用
.NET 6
.NET Framework 的 app.config GCCpuGroup false - 禁用
true - 启用

注意

若要配置公共语言运行时 (CLR),使其也在所有 CPU 组之间分配线程池中的线程,请启用 Thread_UseAllCpuGroups 元素选项。 对于 .NET Core 应用,可以通过将 DOTNET_Thread_UseAllCpuGroups 环境变量的值设置为 1 以启用此选项。

关联

  • 指定是否将垃圾回收线程与处理器关联。 若要关联一个 GC 线程,则意味着它只能在其特定的 CPU 上运行。 为每个 GC 线程创建一个堆。
  • 仅适用于服务器垃圾回收。
  • 默认:将垃圾回收线程与处理器关联。 它等效于将值设置为 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
.NET Framework 的 app.config GCNoAffinitize false - 关联
true - 不关联
.NET Framework 4.6.2

示例:

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

堆限制

  • 指定 GC 堆和 GC 簿记的最大提交大小(以字节为单位)。

  • 此设置仅适用于 64 位计算机。

  • 如果已配置每对象堆限制,则忽略此设置。

  • 默认值(仅在某些情况下适用)是 20 MB 或容器内存限制的 75%(以较大者为准)。 此默认值在以下情况下适用:

设置名 引入的版本
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.template.json 中设置该选项,请指定一个十进制值。 如果要将选项设置为一个环境变量,请指定一个十六进制值。 例如,若要将堆硬限制指定为 200 个兆字节 (MiB),则该值对于 JSON 文件为 209715200,对于环境变量则为 0xC800000 或 C800000。

堆限制百分比

  • 指定允许的 GC 堆使用量占总物理内存的百分比。

  • 如果还设置了 System.GC.heaphdlimit,则忽略此设置。

  • 此设置仅适用于 64 位计算机。

  • 如果进程正在具有指定内存限制的容器中运行,则百分比的计算结果将为该内存限制的百分比。

  • 如果已配置每对象堆限制,则忽略此设置。

  • 默认值(仅在某些情况下适用)是 20 MB 或容器内存限制的 75%(以较大者为准)。 此默认值在以下情况下适用:

设置名 引入的版本
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.template.json 中设置该选项,请指定一个十进制值。 如果要将选项设置为一个环境变量,请指定一个十六进制值。 例如,若要将堆使用率限制为 30%,则该值对于 JSON 文件为 30,对于环境变量则为 0x1E 或 1E。

每对象堆限制

可以根据每个对象堆指定 GC 的允许堆使用量。 不同的堆包括大型对象堆 (LOH)、小型对象堆 (SOH) 和固定对象堆 (POH)。

  • 如果为任何 DOTNET_GCHeapHardLimitSOHDOTNET_GCHeapHardLimitLOHDOTNET_GCHeapHardLimitPOH 设置指定值,则还必须为 DOTNET_GCHeapHardLimitSOHDOTNET_GCHeapHardLimitLOH 指定值。 否则,运行时将无法初始化。
  • DOTNET_GCHeapHardLimitPOH 的默认值为 0。 DOTNET_GCHeapHardLimitSOHDOTNET_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.template.json 中设置该选项,请指定一个十进制值。 如果要将选项设置为一个环境变量,请指定一个十六进制值。 例如,若要将堆硬限制指定为 200 个兆字节 (MiB),则该值对于 JSON 文件为 209715200,对于环境变量则为 0xC800000 或 C800000。

每对象堆限制百分比

可以根据每个对象堆指定 GC 的允许堆使用量。 不同的堆包括大型对象堆 (LOH)、小型对象堆 (SOH) 和固定对象堆 (POH)。

  • 如果为任何 DOTNET_GCHeapHardLimitSOHPercentDOTNET_GCHeapHardLimitLOHPercentDOTNET_GCHeapHardLimitPOHPercent 设置指定值,则还必须为 DOTNET_GCHeapHardLimitSOHPercentDOTNET_GCHeapHardLimitLOHPercent 指定值。 否则,运行时将无法初始化。
  • 如果指定了 DOTNET_GCHeapHardLimitSOHDOTNET_GCHeapHardLimitLOHDOTNET_GCHeapHardLimitPOH,则忽略这些设置。
  • 值为 1 表示 GC 使用该对象堆的总物理内存的 1%。
  • 每个值都必须大于 0 并小于 100。 此外,3 个百分比值的总和必须小于 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.template.json 中设置该选项,请指定一个十进制值。 如果要将选项设置为一个环境变量,请指定一个十六进制值。 例如,若要将堆使用率限制为 30%,则该值对于 JSON 文件为 30,对于环境变量则为 0x1E 或 1E。

高内存百分比

内存负载由正在使用的物理内存的百分比表示。 默认情况下,当物理内存负载达到 90%时,垃圾回收对于执行完整的压缩垃圾回收变得更加积极,以避免分页。 当内存负载低于 90% 时,GC 优先使用后台回收进行完整的垃圾回收,这种方法的暂停时间较短,但不会使堆的总大小减少太多。 在具有大量内存(80 GB 或更多)的计算机上,默认负载阈值介于 90% 到 97% 之间。

可以通过 DOTNET_GCHighMemPercent 环境变量或 System.GC.HighMemoryPercent JSON 配置设置来调整高内存负载阈值。 如果要控制堆大小,请考虑调整阈值。 例如,对于具有 64 GB 内存的计算机上的主要进程,当有 10% 的可用内存时,GC 开始响应是合理的。 但是对于较小的进程(例如,仅消耗 1GB 内存的进程),GC 可以在可用内存少于 10% 的情况下轻松地运行。 对于这些较小的进程,请考虑将阈值设置得更高。 另一方面,如果你希望较大的进程具有较小的堆大小(即使有足够的物理内存可用),要使 GC 更快做出反应以缩小堆大小,则降低此阈值是一种有效的方法。

备注

对于在容器中运行的进程,GC 将根据容器限制考虑物理内存。

设置名 引入的版本
runtimeconfig.json System.GC.HighMemoryPercent 十进制值 .NET 5
环境变量 COMPlus_GCHighMemPercent 十六进制值 .NET Core 3.0
.NET Framework 4.7.2
环境变量 DOTNET_GCHighMemPercent 十六进制值 .NET 6

提示

如果要在 runtimeconfig.template.json 中设置该选项,请指定一个十进制值。 如果要将选项设置为一个环境变量,请指定一个十六进制值。 例如,要将高内存阈值设置为 75%,JSON 文件的值将为 75,而环境变量的值为 0x4B 或 4B。

保留 VM

  • 配置是将应删除的段置于备用列表上供将来使用,还是将其释放回操作系统 (OS)。
  • 默认:将段释放回操作系统。 它等效于将值设置为 false
设置名 引入的版本
runtimeconfig.json System.GC.RetainVM false - 释放到 OS
true - 置于备用列表上
.NET Core 1.0
MSBuild 属性 RetainVMGarbageCollection false - 释放到 OS
true - 置于备用列表上
.NET Core 1.0
环境变量 COMPlus_GCRetainVM 0 - 释放到 OS
1 - 置于备用列表上
.NET Core 1.0
环境变量 DOTNET_GCRetainVM 0 - 释放到 OS
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 千兆字节 (GB) 的数组配置垃圾回收器支持。
  • 默认:垃圾回收支持大于 2 GB 的数组。 它等效于将值设置为 1
  • 在未来的 .NET 版本中,此选项可能会过时。
设置名 引入的版本
runtimeconfig.json 不可用 空值 不可用
环境变量 COMPlus_gcAllowVeryLargeObjects 1 - 启用
0 - 禁用
.NET Core 1.0
环境变量 DOTNET_gcAllowVeryLargeObjects 1 - 启用
0 - 禁用
.NET 6
.NET Framework 的 app.config 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
.NET Framework 的 app.config GCLOHThreshold 十进制值 .NET Framework 4.8

示例:

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

提示

如果要在 runtimeconfig.template.json 中设置该选项,请指定一个十进制值。 如果要将选项设置为一个环境变量,请指定一个十六进制值。 例如,若要将阙值大小设置为 120,000 个字节,则该值对于 JSON 文件为 120,000,对于环境变量则为 0x1D4C0 或 1D4C0。

独立 GC

  • 指定运行时加载的独立 GC DLL 的名称,以代替它在主运行时 DLL (coreclr.dll) 中具有的名称。 此 DLL 需要放在与 coreclr.dll 相同的目录中。
设置名 引入的版本
runtimeconfig.json 不可用 空值 不可用
环境变量 COMPlus_GCName string_path .NET Core 2.0
环境变量 DOTNET_GCName string_path .NET 6

节省内存

  • 配置垃圾回收器来节省内存,但代价是垃圾回收更频繁,并且暂停时间可能更长。
  • 默认值为 0 - 这意味着没有更改。
  • 除了默认值 0 以外,介于 1 至 9(含)的值都有效。 值越高,垃圾回收器越会试图节省内存,进而使堆保持较小。
  • 如果值不为零,则将在大型对象堆具有太多碎片时自动压缩该堆。
设置名 引入的版本
runtimeconfig.json 不可用 空值 不可用
环境变量 COMPlus_GCConserveMemory 0 -9 .NET Framework 4.8
环境变量 DOTNET_GCConserveMemory 0 -9 .NET 6
.NET Framework 的 app.config GCConserveMemory 0 -9 .NET Framework 4.8

app.config 文件示例:


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

提示

尝试不同的数字,看看哪个值最适合你。 从介于 5 至 7 之间的值开始。