ガベージ コレクションの実行時構成オプション
このページには、.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 - バックグラウンド GCfalse -非同時実行 GC |
.NET Core 1.0 |
MSBuild のプロパティ | ConcurrentGarbageCollection |
true - バックグラウンド GCfalse -非同時実行 GC |
.NET Core 1.0 |
環境変数 | COMPlus_gcConcurrent |
1 - バックグラウンド GC0 -非同時実行 GC |
.NET Core 1.0 |
環境変数 | DOTNET_gcConcurrent |
1 - バックグラウンド GC0 -非同時実行 GC |
.NET 6 |
.NET Framework 用の app.config | gcConcurrent | true - バックグラウンド GCfalse -非同時実行 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>
リソース使用量を管理する
次の設定を使用して、ガベージ コレクターのメモリとプロセッサの使用量を管理します。
- 関係付け
- 関係付けマスク
- 関係付け範囲
- CPU グループ
- ヒープ数
- ヒープ のハード制限
- ヒープ ハード制限率
- オブジェクトヒープごとのハード制限
- オブジェクトヒープごとのハード制限率
- 使用率の高いメモリの割合
- VM の保持
これらの設定のいくつかの詳細については、ワークステーションおよびサーバー 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% を超えています。
- Per-object-heap のハード制限が構成されている場合、この設定は無視されます。
設定の名前 | 値 | 導入されたバージョン | |
---|---|---|---|
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 になります。
ヒープ ハード制限率
- 物理メモリの合計に対する割合としてヒープ ハード制限を指定します。 プロセスがメモリ制約のある環境で実行されている場合、つまり、メモリ制限が指定されたコンテナー内では、物理メモリの合計がメモリ制限になります。それ以外の場合は、マシンで使用できる内容です。
- この設定は 64 ビットのコンピューターにのみ該当します。
- この設定は、 Per-object-heap のハード制限 が構成されている場合、または heap ハード制限 が構成されている場合は無視されます。
設定の名前 | 値 | 導入されたバージョン | |
---|---|---|---|
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_GCHeapHardLimitSOH
、DOTNET_GCHeapHardLimitLOH
、DOTNET_GCHeapHardLimitPOH
設定のいずれかの値を指定する場合、DOTNET_GCHeapHardLimitSOH
とDOTNET_GCHeapHardLimitLOH
の値も指定する必要があります。 そうしないと、ランタイムでの初期化が失敗します。DOTNET_GCHeapHardLimitPOH
の既定値は 0 です。DOTNET_GCHeapHardLimitSOH
とDOTNET_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_GCHeapHardLimitSOHPercent
、DOTNET_GCHeapHardLimitLOHPercent
、DOTNET_GCHeapHardLimitPOHPercent
設定のいずれかの値を指定する場合、DOTNET_GCHeapHardLimitSOHPercent
とDOTNET_GCHeapHardLimitLOHPercent
の値も指定する必要があります。 そうしないと、ランタイムでの初期化が失敗します。DOTNET_GCHeapHardLimitSOH
、DOTNET_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 ネイティブ ライブラリの path (.NET 9 以降のバージョン) または 名 のいずれかを指定できます。
Path
- 既定の GC 実装の代わりにランタイムが読み込む GC ネイティブ ライブラリの完全パスを指定します。 セキュリティで保護するには、この場所を悪意のある改ざんの可能性から保護する必要があります。
設定の名前 | 値 | 導入されたバージョン | |
---|---|---|---|
runtimeconfig.json | System.GC.Path |
string_path | .NET 9 |
環境変数 | DOTNET_GCPath |
string_path | .NET 9 |
Name
デフォルトの GC 実装の代わりにランタイムが読み込む GC ネイティブ ライブラリの名前を指定します。 .NET 9 では、 Path 構成の導入により動作が変更されました。
.NET 8 以前のバージョンでは、次の手順を実行します。
- ライブラリの名前のみを指定する場合、ライブラリは .NET ランタイムと同じディレクトリに存在する必要があります (Windows 上のcoreclr.dll 、Linux 上の 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 (包括) の値が有効です。 値が大きいほど、ガベージ コレクターはメモリを節約しようとするため、ヒープが小さく保たれます。
- 値が 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 の値で始めましょう。
アプリケーションサイズへの動的適応 (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 項目を追加することもできます。 Include
属性の値として runtimeconfig.json 設定名を使用します。 たとえば、「MSBuild プロパティ」を参照してください。
.NET