共用方式為


執行階段的記憶體回收設定選項

此頁面包含 .NET 執行階段記憶體回收行程 (GC) 設定的資訊。 如果您嘗試達到執行中應用程式的尖峰效能,請考量使用這些設定。 不過,在一般情況下,預設值會為大部分的應用程式提供最佳效能。

設定會在此頁面上分為多個群組。 每個群組內的設定通常會彼此搭配使用,以達成特定結果。

注意

  • 只有在初始化 GC 時,這些設定才會由執行階段讀取 (這通常表示在流程啟動時間期間)。 如果您在流程正在進行時變更環境變數,該變更將不會反映在該流程中。 您可以在執行階段透過 API 變更的設定會從此頁面省略,例如延遲等級
  • 因為 GC 是每個流程,所以不太適合在機器等級進行這些設定。 例如,您不希望機器上的每個 .NET 流程都使用伺服器 GC 或相同的堆積硬性限制。
  • 針對數值,針對 runtimeconfig.jsonruntimeconfig.template.json 檔案中的設定使用十進位標記法,並針對環境變數設定使用十六進位標記法。 針對十六進位值,您可以使用或不使用「0x」前置詞來指定這些值。
  • 如果您使用環境變數,.NET 6 和更新版本會在前置詞 DOTNET_ 上標準化,而不是 COMPlus_。 不過,COMPlus_ 前置詞將繼續運作。 如果您使用舊版的 .NET 執行階段,您仍應使用 COMPlus_ 前置詞,例如 COMPlus_gcServer

指定設定的方式

針對不同版本的 .NET 執行階段,有不同的方式可以指定設定值。 下表說明摘要。

設定位置 此位置適用的 .NET 版本 格式 解譯方式
runtimeconfig.json file/
runtimeconfig.template.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 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.jsonruntimeconfig.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
  }
}

記憶體回收的變體

記憶體回收的兩個主要變體是工作站 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
      }
   }
}

runtimeconfig.template.json 檔案:

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

專案檔:

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

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

</Project>

背景 GC

  • 設定是否啟用背景 (並行) 記憶體回收。
  • 預設:使用背景 GC。 這相當於設定 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
      }
   }
}

runtimeconfig.template.json 檔案:

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

專案檔:

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

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

</Project>

管理資源使用量

使用下列設定來管理記憶體回收行程的記憶體和處理器使用量:

如需其中一些設定的詳細資訊,請參閱工作站與伺服器 GC 之間的中間點部落格文章。

堆積計數

設定名稱 導入的版本
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

此組態設定沒有特定的 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。

同質化遮罩

  • 指定記憶體回收行程執行緒應該使用的確切處理器。
  • 如果停用 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

此組態設定沒有特定的 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 作業系統,請在處理器編號或範圍前面加上對應的 CPU 群組,例如「0:1-10,0:12,1:50-52,1:7」。 如果實際上沒有超過 1 個 CPU 群組,就無法使用此設定。 您必須使用同質化遮罩設定。 您指定的數字位於該群組內,這表示其不可為 >= 64。
  • 針對 Linux 作業系統,其中 CPU 群組概念不存在,您可以使用此設定和同質化遮罩設定來指定相同的範圍。 因為不需要指定群組索引,所以請指定「1-10」,而不是「0:1-10」。
  • 如果停用 GC 處理器同質化,則會忽略此設定。
  • 僅適用於伺服器記憶體回收。
  • 如需詳細資訊,請參閱在 Maoni Stephens 的部落格上的在機器上使用 > 64 個 CPU 對於 GC 進行更好的 CPU 設定
設定名稱 導入的版本
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"
   }
}

CPU 群組

  • 設定記憶體回收行程是否使用 CPU 群組

    64 位元 Windows 電腦有多個 CPU 群組時,也就是 64 個以上的處理器,啟用這個元素可延伸所有 CPU 群組的記憶體回收。 記憶體回收行程會使用所有核心來建立和平衡堆積。

    注意

    這是僅限 Windows 的概念。 在舊版 Windows 中,Windows 將程序限制為一個 CPU 群組。 因此,除非您使用此設定來啟用多個 CPU 群組,否則 GC 只會使用一個 CPU 群組。 Windows 11 和 Server 2022 已取消這一 OS 限制。 此外,從 .NET 7 開始,GC 預設會在 Windows 11 或 Server 2022 上執行時使用所有 CPU 群組。

  • 僅適用於 64 位元 Windows 作業系統上的伺服器記憶體回收。

  • 預設:GC 不會延伸至 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 - 已啟用

此組態設定沒有特定的 MSBuild 屬性。 不過,您可以改為新增 RuntimeHostConfigurationOption MSBuild 項目。 使用 runtimeconfig.json 設定名稱作為 Include 屬性的值。 如需範例,請參閱 MSBuild 屬性

注意

若要設定 Common Language Runtime (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

此組態設定沒有特定的 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 MB 或 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 MiB,則 JSON 檔案的值會是 209715200,而環境變數的值會是 0xC800000 或 C800000。

堆積硬性限制百分比

  • 將堆積硬性限制指定為物理記憶體總計的百分比。 如果進程是在記憶體限制的環境中執行,也就是在具有指定記憶體限制的容器內,則物理記憶體總計為記憶體限制;否則,這是計算機上可用的功能。
  • 此設定僅適用於 64 位元電腦。
  • 如果已設定 Per-object-heap 硬性限制或已設定堆積硬性限制則會忽略此設定。
設定名稱 導入的版本
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_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

這些組態設定沒有特定的 MSBuild 屬性。 不過,您可以改為新增 RuntimeHostConfigurationOption MSBuild 項目。 使用 runtimeconfig.json 設定名稱作為 Include 屬性的值。 如需範例,請參閱 MSBuild 屬性

提示

如果您要在 runtimeconfig.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% 的總實體記憶體。
  • 每個值都必須大於零並小於 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% 時,針對具有較短暫停但不會大幅減少堆積大小的總堆積大小,GC 偏好使用背景收集。 在記憶體大量 (80GB 或更多) 的機器上,預設負載閾值介於 90% 到 97%。

DOTNET_GCHighMemPercent 環境變數或 System.GC.HighMemoryPercent JSON 組態設定可以調整高記憶體負載閾值。 如果您想要控制堆積大小,請考慮調整臨界值。 例如,對於有 64 GB 記憶體的機器上的主要流程,GC 在有 10% 的可用記憶體時開始回應是合理的。 不過,假設對於較小的流程只耗用 1 GB 記憶體的流程,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

此組態設定沒有特定的 MSBuild 屬性。 不過,您可以改為新增 RuntimeHostConfigurationOption MSBuild 項目。 使用 runtimeconfig.json 設定名稱作為 Include 屬性的值。 如需範例,請參閱 MSBuild 屬性

提示

如果您要在 runtimeconfig.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
      }
   }
}

runtimeconfig.template.json 檔案:

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

專案檔:

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

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

</Project>

大型頁面

  • 指定設定堆積硬式限制時,是否應該使用大型頁面。
  • 預設:設定堆積硬式限制時,請勿使用大型頁面。 這相當於設定 0 值。
  • 這是實驗設定。
設定名稱 導入的版本
runtimeconfig.json N/A N/A N/A
環境變數 COMPlus_GCLargePages 0 - 已停用
1 - 已啟用
.NET Core 3.0
環境變數 DOTNET_GCLargePages 0 - 已停用
1 - 已啟用
.NET 6

允許大型物件

  • 針對大小總計大於 2 GB 的陣列,設定 64 位元平台上的記憶體回收行程支援。
  • 預設:GC 支援大於 2 GB 的陣列。 這相當於設定 1 值。
  • 這個選項可能會在未來版本的 .NET 中淘汰。
設定名稱 導入的版本
runtimeconfig.json N/A N/A N/A
環境變數 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 個位元組。
  • 您指定的值必須大於預設閾值。
  • 執行階段可能會將該值限制在目前設定的最大可能大小。 您可以透過 GC.GetConfigurationVariables() API 在執行階段檢查作用中的值。
設定名稱 導入的版本
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

此組態設定沒有特定的 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 實作,您可以指定路徑(在 .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 運行時間相同的目錄中(Windows 上coreclr.dllLinux 上的 libcoreclr.so ,或 OSX 上的 libcoreclr.dylib )。
    • 例如,如果您指定 “.,此值也可以是相對路徑。Windows 上的 \clrgc.dll“, clrgc.dll 會從 .NET 運行時間目錄的父目錄載入。

    在 .NET 9 和更新版本中,此值僅指定檔名(不允許路徑):

    • .NET 會在包含您應用程式方法的 Main 元件所在的目錄中搜尋您指定的名稱。
    • 如果找不到檔案,則會搜尋 .NET 運行時間目錄。
  • 如果指定Path組態,則會忽略此組態設定。

設定名稱 導入的版本
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
適用於 .NET Framework 的 app.config 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 屬性