ガベージ コレクションの実行時構成オプション

このページには、.NET ランタイム ガベージ コレクター (GC) の設定に関する情報が含まれています。 実行中のアプリのピーク時のパフォーマンスを実現しようとしている場合は、これらの設定の使用を検討してください。 しかし、一般的な状況では、既定値でほとんどのアプリケーションに最適なパフォーマンスが得られます。

このページでは、設定はグループにまとめられます。 各グループ内の設定は一般的に、特定の結果を得るために相互に組み合わせて使用されます。

メモ

  • これらの構成は、GC が初期化されたとき (通常はプロセスの起動時) にのみランタイムによって読み取られます。 プロセスが既に実行されているときに環境変数を変更しても、変更はそのプロセスには反映されません。 このページでは、実行時に API を使用して変更できる設定 ( 待機時間レベルなど) は省略されています。
  • GC はプロセスごとに行われるため、これらの構成をマシン レベルで設定することに意味はほとんどありません。 たとえば、マシン上のすべての .NET プロセスでサーバー GC または同じヒープのハード制限を使用する必要はありません。
  • 数値の場合、runtimeconfig.json または runtimeconfig.template.json ファイルの設定には 10 進表記、環境変数の設定には 16 進表記を使用します。 16 進値の場合は、プレフィックス "0x" を付けても付けなくても指定できます。
  • 環境変数を使用している場合、.NET 6 以降のバージョンでのプレフィックスの標準は、COMPlus_ ではなく DOTNET_ です。 ただし、プレフィックス COMPlus_ は引き続き機能します。 以前のバージョンの .NET ランタイムを使用している場合は、COMPlus_ プレフィックスをまだ使用する必要があります (例: COMPlus_gcServer)。

構成を指定する方法

.NET ランタイムのバージョンが異なると、構成値を指定する方法も異なります。 次の表にその概要を示します。

構成の場所 この場所が適用される .NET バージョン 形式 解釈方法
runtimeconfig.json file/
runtimeconfig.template.json ファイル
.NET (Core) n n は 10 進数値として解釈されます。
環境変数 .NET Framework, .NET (Core) 0xn または n n はどちらの形式でも 16 進数値として解釈されます
app.config ファイル .NET Framework 0xn n は 16 進数値として解釈されます1

1 app.config ファイル設定で、0x プレフィックスを付けずに値を指定できますが、推奨されません。 .NET Framework 4.8 以降では、バグにより、0x プレフィックスを付けずに指定した値は 16 進数として解釈されますが、以前のバージョンの.NET Framework では、10 進数として解釈されます。 構成を変更する必要がないよう、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 の両方で、環境変数を使用できます。

.NET 6 以降を使用する Windows の場合:

SET DOTNET_gcServer=1
SET DOTNET_GCHeapCount=c

.NET 5 以前を使用する Windows の場合:

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

ガベージ コレクションのフレーバー

ガベージ コレクションの主な 2 つのフレーバーは、ワークステーション GC とサーバー GC です。 2 つの間の相違点について詳しくは、「ワークステーションとサーバーのガベージ コレクション」をご覧ください。

ガベージ コレクションのサブフレーバーは、バックグラウンドと非同時実行です。

ガベージ コレクションのフレーバーを選択するには、以下の設定を使用します。

ワークステーションとサーバー

  • アプリケーションで、ワークステーション ガベージ コレクションとサーバー ガベージ コレクションのどちらを使用するかを構成します。
  • 既定値: ワークステーション ガベージ コレクション。 これは、値を 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 間の妥協点に関するブログ エントリを参照してください。

ヒープ数

  • ガベージ コレクターによって作成されるヒープの数を制限します。
  • サーバー ガベージ コレクションにのみ適用されます。
  • GC プロセッサの関係が有効になっている場合 (既定値)、ヒープ数の設定では、最初の n プロセッサに n GC ヒープやスレッドを関連付けます。 (関係付けマスクまたは関係付け範囲の設定を使用して、関係付けるプロセッサを正確に指定します)。
  • GC プロセッサの関係が無効になっている場合、この設定によって GC ヒープの数が制限されます。
  • 詳細については、GCHeapCount の解説に関する記述を参照してください。
設定の名前 導入されたバージョン
runtimeconfig.json System.GC.HeapCount "10 進値" .NET Core 3.0
環境変数 COMPlus_GCHeapCount "16 進値" .NET Core 3.0
環境変数 DOTNET_GCHeapCount "16 進値" .NET 6
.NET Framework 用の app.config GCHeapCount "10 進値" .NET Framework 4.6.2

この構成設定には特定の MSBuild プロパティがありません。 ただし、代わりに RuntimeHostConfigurationOption MSBuild 項目を追加することもできます。 Include 属性の値として runtimeconfig.json 設定名を使用します。 たとえば、「MSBuild プロパティ」を参照してください。

runtimeconfig.json ファイル:

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

runtimeconfig.template.json ファイル:

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

ヒント

runtimeconfig.json でオプションを設定する場合は、10 進値を指定します。 環境変数としてオプションを設定する場合は、16 進値を指定します。 たとえば、ヒープの数を 16 に制限する場合、値は JSON ファイルでは 16、環境変数では 0x10 または 10 になります。

関係付けマスク

  • ガベージ コレクター スレッドで使用する必要がある正確なプロセッサを指定します。
  • GC プロセッサの関係が無効になっている場合、この設定は無視されます。
  • サーバー ガベージ コレクションにのみ適用されます。
  • この値は、プロセスで使用できるプロセッサを定義するビット マスクです。 たとえば、10 進値の 1023 (環境変数を使用する場合は、16 進値の 0x3FF または 3FF) は、バイナリ表記では 0011 1111 1111 となります。 これにより、最初の 10 プロセッサが使用されることが指定されます。 次の 10 プロセッサ (つまり、10 から 19 プロセッサ) を指定するには、10 進値の 1047552 (または 16 進値の 0xFFC00 または FFC00) を指定します。これは、バイナリ値の 1111 1111 1100 0000 0000 に相当します。
設定の名前 導入されたバージョン
runtimeconfig.json System.GC.HeapAffinitizeMask "10 進値" .NET Core 3.0
環境変数 COMPlus_GCHeapAffinitizeMask "16 進値" .NET Core 3.0
環境変数 DOTNET_GCHeapAffinitizeMask "16 進値" .NET 6
.NET Framework 用の app.config GCHeapAffinitizeMask "10 進値" .NET Framework 4.6.2

この構成設定には特定の MSBuild プロパティがありません。 ただし、代わりに RuntimeHostConfigurationOption MSBuild 項目を追加することもできます。 Include 属性の値として runtimeconfig.json 設定名を使用します。 たとえば、「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 グループをお持ちでない場合は、この設定を使用できません。 Affinitize マスクの設定を使用する必要があります。 指定した数値はそのグループ内にあります。つまり、>= 64 にすることはできません。
  • CPU グループの概念が存在しない Linux オペレーティング システムでは、この設定と Affinitize マスク設定の両方を使用して、同じ範囲を指定できます。 また、グループ インデックスを指定する必要がないため、"0:1-10" の代わりに "1- 10" を指定します。
  • GC プロセッサの関係が無効になっている場合、この設定は無視されます。
  • サーバー ガベージ コレクションにのみ適用されます。
  • 詳細については、Maoni Stephens のブログの「CPU が 64 を超えるコンピューター上での 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 項目を追加することもできます。 Include 属性の値として runtimeconfig.json 設定名を使用します。 たとえば、「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 グループ全体にガベージ コレクションが拡張されます。 ガベージ コレクターではすべてのコアを使用し、ヒープを作成して分散させます。

    Note

    これは Windows のみに該当する概念です。 以前のバージョンの Windows では、Windows によりプロセスが 1 つの CPU グループに制限されていました。 したがって、この設定を使用して複数の CPU グループを有効にしない限り、GC では 1 つの CPU グループのみが使用されました。 この OS の制限は、Windows 11 および Server 2022 で解除されました。 また、.NET 7 以降では、Windows 11 または Server 2022 で実行されている場合、GC は既定ですべての CPU グループを使用します。

  • 64 ビット Windows オペレーティング システムのみのサーバー ガベージ コレクションに適用されます。

  • 既定値: GC は複数の CPU グループに拡張されません。 これは、値を 0 に設定した場合と同じです。

  • 詳細については、Maoni Stephens のブログの「CPU が 64 を超えるコンピューター上での 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 項目を追加することもできます。 Include 属性の値として runtimeconfig.json 設定名を使用します。 たとえば、「MSBuild プロパティ」を参照してください。

Note

すべての CPU グループ全体にスレッド プールからのスレッドも分散するように共通言語ランタイム (CLR) を構成するには、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 項目を追加することもできます。 Include 属性の値として runtimeconfig.json 設定名を使用します。 たとえば、「MSBuild プロパティ」を参照してください。

runtimeconfig.json ファイル:

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

runtimeconfig.template.json ファイル:

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

ヒープの制限

  • GC ヒープおよび GC ブックキーピングに対して、最大コミット サイズをバイト単位で指定します。

  • この設定は 64 ビットのコンピューターにのみ該当します。

  • オブジェクトごとのヒープの制限が構成されている場合、この設定は無視されます。

  • 特定のケースにのみ該当する既定値は、20 MB より大、またはコンテナーのメモリ制限の 75% より大です。 次の場合に既定値は該当します。

    • プロセスが、メモリ制限が指定されたコンテナー内で実行されています。
    • System.GC.HeapHardLimitPercent が設定されていません。
設定の名前 導入されたバージョン
runtimeconfig.json System.GC.HeapHardLimit "10 進値" .NET Core 3.0
環境変数 COMPlus_GCHeapHardLimit "16 進値" .NET Core 3.0
環境変数 DOTNET_GCHeapHardLimit "16 進値" .NET 6

この構成設定には特定の MSBuild プロパティがありません。 ただし、代わりに RuntimeHostConfigurationOption MSBuild 項目を追加することもできます。 Include 属性の値として runtimeconfig.json 設定名を使用します。 たとえば、「MSBuild プロパティ」を参照してください。

runtimeconfig.json ファイル:

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

runtimeconfig.template.json ファイル:

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

ヒント

runtimeconfig.json でオプションを設定する場合は、10 進値を指定します。 環境変数としてオプションを設定する場合は、16 進値を指定します。 たとえば、ヒープのハード制限を 200 メビバイト (MiB) に指定する場合、値は JSON ファイルでは 209715200、環境変数では 0xC800000 または C800000 になります。

ヒープの制限の割合

  • 許容可能な GC ヒープの使用量を、物理メモリ合計に対する割合として指定します。

  • この設定は、System.GC.HeapHardLimit も設定されている場合、無視されます。

  • この設定は 64 ビットのコンピューターにのみ該当します。

  • プロセスが、メモリ制限が指定されたコンテナー内で実行されている場合、パーセンテージはそのメモリ制限に対するパーセンテージとして計算されます。

  • オブジェクトごとのヒープの制限が構成されている場合、この設定は無視されます。

  • 特定のケースにのみ該当する既定値は、20 MB より大、またはコンテナーのメモリ制限の 75% より大です。 次の場合に既定値は該当します。

    • プロセスが、メモリ制限が指定されたコンテナー内で実行されています。
    • System.GC.HeapHardLimit が設定されていません。
設定の名前 導入されたバージョン
runtimeconfig.json System.GC.HeapHardLimitPercent "10 進値" .NET Core 3.0
環境変数 COMPlus_GCHeapHardLimitPercent "16 進値" .NET Core 3.0
環境変数 DOTNET_GCHeapHardLimitPercent "16 進値" .NET 6

この構成設定には特定の MSBuild プロパティがありません。 ただし、代わりに RuntimeHostConfigurationOption MSBuild 項目を追加することもできます。 Include 属性の値として runtimeconfig.json 設定名を使用します。 たとえば、「MSBuild プロパティ」を参照してください。

runtimeconfig.json ファイル:

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

runtimeconfig.template.json ファイル:

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

ヒント

runtimeconfig.json でオプションを設定する場合は、10 進値を指定します。 環境変数としてオプションを設定する場合は、16 進値を指定します。 たとえば、ヒープの使用量を 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 "10 進値" .NET 5
環境変数 COMPlus_GCHeapHardLimitSOH "16 進値" .NET 5
環境変数 DOTNET_GCHeapHardLimitSOH "16 進値" .NET 6
設定の名前 導入されたバージョン
runtimeconfig.json System.GC.HeapHardLimitLOH "10 進値" .NET 5
環境変数 COMPlus_GCHeapHardLimitLOH "16 進値" .NET 5
環境変数 DOTNET_GCHeapHardLimitLOH "16 進値" .NET 6
設定の名前 導入されたバージョン
runtimeconfig.json System.GC.HeapHardLimitPOH "10 進値" .NET 5
環境変数 COMPlus_GCHeapHardLimitPOH "16 進値" .NET 5
環境変数 DOTNET_GCHeapHardLimitPOH "16 進値" .NET 6

これらの構成設定には、特定の MSBuild プロパティがありません。 ただし、代わりに RuntimeHostConfigurationOption MSBuild 項目を追加することもできます。 Include 属性の値として runtimeconfig.json 設定名を使用します。 たとえば、「MSBuild プロパティ」を参照してください。

ヒント

runtimeconfig.json でオプションを設定する場合は、10 進値を指定します。 環境変数としてオプションを設定する場合は、16 進値を指定します。 たとえば、ヒープのハード制限を 200 メビバイト (MiB) に指定する場合、値は JSON ファイルでは 209715200、環境変数では 0xC800000 または C800000 になります。

オブジェクトごとのヒープの制限の割合

オブジェクトごとのヒープに基づいて、GC で許容されるヒープ使用量を指定できます。 ヒープには、大きなオブジェクト ヒープ (LOH)、小さなオブジェクト ヒープ (SOH)、固定オブジェクト ヒープ (POH) があります。

  • DOTNET_GCHeapHardLimitSOHPercentDOTNET_GCHeapHardLimitLOHPercentDOTNET_GCHeapHardLimitPOHPercent 設定のいずれかの値を指定する場合、DOTNET_GCHeapHardLimitSOHPercentDOTNET_GCHeapHardLimitLOHPercent の値も指定する必要があります。 そうしないと、ランタイムでの初期化が失敗します。
  • DOTNET_GCHeapHardLimitSOHDOTNET_GCHeapHardLimitLOH、および DOTNET_GCHeapHardLimitPOH が指定されている場合、これらの設定は無視されます。
  • 値 1 は、GC によって合計物理メモリの 1% がそのオブジェクト ヒープに使用されることを意味します。
  • 各値は、ゼロより大きく、100 未満である必要があります。 また、3 つのパーセンテージ値の合計は、100 未満である必要があります。 それ以外の場合、ランタイムでの初期化が失敗します。
設定の名前 導入されたバージョン
runtimeconfig.json System.GC.HeapHardLimitSOHPercent "10 進値" .NET 5
環境変数 COMPlus_GCHeapHardLimitSOHPercent "16 進値" .NET 5
環境変数 DOTNET_GCHeapHardLimitSOHPercent "16 進値" .NET 6
設定の名前 導入されたバージョン
runtimeconfig.json System.GC.HeapHardLimitLOHPercent "10 進値" .NET 5
環境変数 COMPlus_GCHeapHardLimitLOHPercent "16 進値" .NET 5
環境変数 DOTNET_GCHeapHardLimitLOHPercent "16 進値" .NET 6
設定の名前 導入されたバージョン
runtimeconfig.json System.GC.HeapHardLimitPOHPercent "10 進値" .NET 5
環境変数 COMPlus_GCHeapHardLimitPOHPercent "16 進値" .NET 5
環境変数 DOTNET_GCHeapHardLimitPOHPercent "16 進値" .NET 6

これらの構成設定には、特定の MSBuild プロパティがありません。 ただし、代わりに RuntimeHostConfigurationOption MSBuild 項目を追加することもできます。 Include 属性の値として runtimeconfig.json 設定名を使用します。 たとえば、「MSBuild プロパティ」を参照してください。

ヒント

runtimeconfig.json でオプションを設定する場合は、10 進値を指定します。 環境変数としてオプションを設定する場合は、16 進値を指定します。 たとえば、ヒープの使用量を 30% に制限する場合、値は JSON ファイルでは 30、環境変数では 0x1E または 1E になります。

使用率の高いメモリの割合

メモリの負荷は、使用されている物理メモリの割合によって示されます。 既定では、物理メモリの負荷が 90%に達すると、ガベージコレクションがより積極的に完全に実行され、ガベージ コレクションが圧縮されてページングが回避されるようになります。 メモリの負荷が 90% 未満の場合、GC によって、フル ガベージ コレクションに対するバックグラウンド コレクションが優先されます。一時停止は短くなりますが、ヒープ サイズの合計はそれほど小さくなりません。 大量のメモリ (80 GB 以上) が搭載されたコンピューターでは、負荷のしきい値は 90% から 97% が既定値です。

使用率の高いメモリの負荷のしきい値は、DOTNET_GCHighMemPercent 環境変数、または System.GC.HighMemoryPercent JSON 構成設定によって調整できます。 ヒープ サイズを制御する場合は、しきい値の調整を検討してください。 たとえば、64 GB のメモリを搭載したコンピューター上で最も優先度の高いプロセスでは、使用可能なメモリが 10% あれば、GC が反応を開始するのが妥当です。 ただし、サイズの小さいプロセス、たとえば 1 GB のメモリしか消費しないプロセスでは、使用可能なメモリが 10% 未満でも、GC を快適に実行できます。 このような小さいプロセスでは、しきい値を高く設定することを検討してください。 一方、大きなプロセスでヒープ サイズを小さくする場合は、使用可能な物理メモリが十分にあったとしても、このしきい値を低くすると、GC がすぐに反応してヒープを圧縮できるため、方法としては効率的です。

メモ

コンテナーで実行されているプロセスの場合、GC によって、コンテナーの制限に基づいて物理メモリが考慮されます。

設定の名前 導入されたバージョン
runtimeconfig.json System.GC.HighMemoryPercent "10 進値" .NET 5
環境変数 COMPlus_GCHighMemPercent "16 進値" .NET Core 3.0
.NET Framework 4.7.2
環境変数 DOTNET_GCHighMemPercent "16 進値" .NET 6

この構成設定には特定の MSBuild プロパティがありません。 ただし、代わりに RuntimeHostConfigurationOption MSBuild 項目を追加することもできます。 Include 属性の値として runtimeconfig.json 設定名を使用します。 たとえば、「MSBuild プロパティ」を参照してください。

ヒント

runtimeconfig.json でオプションを設定する場合は、10 進値を指定します。 環境変数としてオプションを設定する場合は、16 進値を指定します。 たとえば、使用率の高いメモリのしきい値を 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
環境変数 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
環境変数 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 "10 進値" .NET Core 1.0
環境変数 COMPlus_GCLOHThreshold "16 進値" .NET Core 1.0
環境変数 DOTNET_GCLOHThreshold "16 進値" .NET 6
.NET Framework 用の app.config GCLOHThreshold "10 進値" .NET Framework 4.8

この構成設定には特定の MSBuild プロパティがありません。 ただし、代わりに RuntimeHostConfigurationOption MSBuild 項目を追加することもできます。 Include 属性の値として runtimeconfig.json 設定名を使用します。 たとえば、「MSBuild プロパティ」を参照してください。

runtimeconfig.json ファイル:

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

runtimeconfig.template.json ファイル:

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

ヒント

runtimeconfig.json でオプションを設定する場合は、10 進値を指定します。 環境変数としてオプションを設定する場合は、16 進値を指定します。 たとえば、しきい値のサイズを 120,000 バイトに設定する場合、値は JSON ファイルでは 120000、環境変数では 0x1D4C0 または 1D4C0 になります。

スタンドアロン GC

  • デフォルトの GC 実装の代わりにランタイムが読み込む GC ネイティブ ライブラリの名前を指定します。 このネイティブ ライブラリは、.NET ランタイム (Windows の場合は coreclr.dll、Linux の場合は libcoreclr.so) と同じディレクトリに存在する必要があります。
設定の名前 導入されたバージョン
runtimeconfig.json N/A 該当なし N/A
環境変数 COMPlus_GCName string_path .NET Core 2.0
環境変数 DOTNET_GCName string_path .NET 6

メモリを節約する

  • メモリを節約するためのガベージ コレクターは、ガベージ コレクションの頻度が高くなり、一時停止時間が長くなる可能性と引き換えに構成されます。
  • 既定値は 0 です。これは変更なしを意味します。
  • 既定値 0 に加え、1 から 9 (包括) の値が有効です。 値が大きいほど、ガベージ コレクターはメモリを節約しようとするため、ヒープが小さく保たれます。
  • 値が 0 以外の場合、断片化が多すぎると、大きなオブジェクト ヒープが自動的に圧縮されます。
設定の名前 導入されたバージョン
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 項目を追加することもできます。 Include 属性の値として runtimeconfig.json 設定名を使用します。 たとえば、「MSBuild プロパティ」を参照してください。

app.config ファイルの例:


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

ヒント

さまざまな数値を試して、最適な値を確認してください。 5 から 7 の値で始めましょう。