가비지 수집을 위한 런타임 구성 옵션

이 페이지에는 .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 file
.NET(Core) n n은 10진수 값으로 해석합니다.
환경 변수 .NET Framework, .NET(Core) 0xn 또는 n n은 두 서식 중 하나에서 16진수 값으로 해석합니다.
app.config 파일 .NET Framework 0xn n은 16진수 값1으로 해석합니다.

10x 접두사가 app.config 파일 설정에 없어도 값을 지정할 수는 있지만 권장하지는 않습니다. .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입니다. 둘 사이의 차이점에 대한 자세한 내용은 워크스테이션 및 가비지 수집을 참조하세요.

가비지 수집의 하위 버전은 백그라운드와 비동시입니다.

다음 설정을 사용하여 가비지 수집의 버전을 선택합니다.

워크스테이션과 서버 비교

  • 애플리케이션이 워크스테이션 가비지 수집과 서버 가비지 수집 중 어느 것을 사용하는지 구성합니다.
  • 기본값: 워크스테이션 가비지 수집. 이는 값을 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>

리소스 사용량 관리

다음 설정을 사용하여 가비지 수집기의 메모리 및 프로세서 사용량을 관리합니다.

이들 중 일부 설정에 대한 자세한 내용은 Middle ground between workstation and server GC(워크스테이션 및 서버 GC의 중간 지점) 블로그 게시물을 참조하세요.

힙 수

  • 가비지 수집기가 생성하는 힙의 개수를 제한합니다.
  • 서버 가비지 수집에만 적용됩니다.
  • GC 프로세서 선호도가 사용하도록 설정된 경우(기본값), 힙 개수 설정은 n GC 힙/스레드의 선호도를 처음 n개의 프로세서로 지정합니다. (정확히 어떤 프로세서의 선호도를 지정하려는지 지정하려면 선호도 지정 마스크 또는 선호도 지정 범위 설정을 사용하세요.)
  • 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 항목을 대신 추가할 수 있습니다. runtimeconfig.json 설정 이름을 Include 특성 값으로 사용합니다. 예를 들어 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 항목을 대신 추가할 수 있습니다. runtimeconfig.json 설정 이름을 Include 특성 값으로 사용합니다. 예를 들어 msBuild 속성을 참조하세요.

예제

runtimeconfig.json 파일:

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

runtimeconfig.template.json 파일:

{
   "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: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 그룹으로 제한했습니다. 따라서 GC는 이 설정을 사용하여 여러 CPU 그룹을 사용하도록 설정하지 않는 한 하나의 CPU 그룹만 사용했습니다. 이 OS 제한은 Windows 11 및 Server 2022에서 없어졌습니다. 또한, .NET 7부터는 GC를 Windows 11 또는 Server 2022에서 실행할 때 해당 GC가 기본적으로 모든 CPU 그룹을 사용합니다.

  • 64비트 Windows 운영 체제의 서버 가비지 수집에만 적용됩니다.

  • 기본값: GC가 CPU 그룹 간에 확장되지 않습니다. 이는 값을 0으로 설정하는 것과 같습니다.

  • 자세한 내용은 Maoni Stephens의 블로그에서 Making CPU configuration better for GC on machines with > 64 CPUs(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 항목을 대신 추가할 수 있습니다. runtimeconfig.json 설정 이름을 Include 특성 값으로 사용합니다. 예를 들어 msBuild 속성을 참조하세요.

참고 항목

모든 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 항목을 대신 추가할 수 있습니다. runtimeconfig.json 설정 이름을 Include 특성 값으로 사용합니다. 예를 들어 msBuild 속성을 참조하세요.

예제

runtimeconfig.json 파일:

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

runtimeconfig.template.json 파일:

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

힙 제한

  • GC 힙 및 GC 기록의 최대 커밋 크기를 바이트 단위로 지정합니다.

  • 이 설정은 64비트 컴퓨터에만 적용됩니다.

  • 개체별 힙 제한을 구성하면 이 설정은 무시됩니다.

  • 특정 경우에만 적용되는 기본값은 컨테이너에 대한 메모리 제한의 20MB 또는 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 항목을 대신 추가할 수 있습니다. runtimeconfig.json 설정 이름을 Include 특성 값으로 사용합니다. 예를 들어 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비트 컴퓨터에만 적용됩니다.

  • 프로세스가 지정된 메모리 제한이 있는 컨테이너 내에서 실행되는 경우 백분율은 해당 메모리 제한의 백분율로 계산됩니다.

  • 개체별 힙 제한을 구성하면 이 설정은 무시됩니다.

  • 특정 경우에만 적용되는 기본값은 컨테이너에 대한 메모리 제한의 20MB 또는 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 항목을 대신 추가할 수 있습니다. runtimeconfig.json 설정 이름을 Include 특성 값으로 사용합니다. 예를 들어 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_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 항목을 대신 추가할 수 있습니다. runtimeconfig.json 설정 이름을 Include 특성 값으로 사용합니다. 예를 들어 msBuild 속성을 참조하세요.

runtimeconfig.json의 옵션을 설정할 때는 10진수 값을 지정합니다. 옵션을 환경 변수로 설정할 때는 16진수 값을 지정합니다. 예를 들어, 힙의 하드 한도를 200메비바이트(MiB) 지정하려면 JSON 파일의 경우 값을 209715200으로 지정하고 환경 변수의 경우 값을 0xC800000 또는 C800000으로 지정합니다.

개체별-힙 제한 비율

개체별 힙을 기준으로 GC의 허용되는 힙 사용량을 지정할 수 있습니다. LOH(대형 개체 힙), SOH(작은 개체 힙), POH(고정 개체 힙) 등의 다양한 힙이 있습니다.

  • DOTNET_GCHeapHardLimitSOHPercent, DOTNET_GCHeapHardLimitLOHPercent 또는 DOTNET_GCHeapHardLimitPOHPercent 설정 중 하나의 값을 지정하는 경우 DOTNET_GCHeapHardLimitSOHPercentDOTNET_GCHeapHardLimitLOHPercent의 값도 지정해야 합니다. 그러지 않으면 런타임이 초기화되지 않습니다.
  • DOTNET_GCHeapHardLimitSOH, DOTNET_GCHeapHardLimitLOHDOTNET_GCHeapHardLimitPOH를 지정하면 해당 설정은 무시됩니다.
  • 값이 1이면 GC가 해당 개체 힙의 총 실제 메모리 중 1%를 사용합니다.
  • 각 값은 0보다 크고 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 항목을 대신 추가할 수 있습니다. runtimeconfig.json 설정 이름을 Include 특성 값으로 사용합니다. 예를 들어 msBuild 속성을 참조하세요.

runtimeconfig.json의 옵션을 설정할 때는 10진수 값을 지정합니다. 옵션을 환경 변수로 설정할 때는 16진수 값을 지정합니다. 예를 들어, 힙의 사용량을 30%로 제한하려면 JSON 파일의 경우 값을 30으로 지정하고 환경 변수의 경우 값을 0x1E 또는 1E로 지정합니다.

최소 메모리 비율

메모리 로드는 사용 중인 실제 메모리의 비율로 표시됩니다. 기본적으로 실제 메모리 부하가 90%에 도달하면 가비지 수집은 페이징이 발생하지 않도록 더 적극적으로 가비지 수집을 꽉 채우고 완전히 압축하려고 합니다. 메모리 부하가 90% 미만이면 GC는 전체 가비지 수집을 백그라운드에서 수행하여 일시 중지 시간을 줄이면서 전체 힙 크기는 크게 줄이지 않으려고 합니다. 많은 양의 메모리(80GB 이상)를 사용하는 머신에서 기본 부하 임계값은 90~97%입니다.

높은 메모리 부하 임계값은 DOTNET_GCHighMemPercent 환경 변수 또는 System.GC.HighMemoryPercent JSON 구성 설정으로 조정할 수 있습니다. 힙 크기를 제어하려면 임계값을 조정하는 것이 좋습니다. 예를 들어 메모리가 64GB인 컴퓨터의 주요 프로세스의 경우, 가용 메모리가 10%가 되면 GC가 반응하기 시작하는 것이 합당합니다. 그러나 작은 프로세스(예: 1GB 메모리만 사용하는 프로세스)의 경우 가용 메모리가 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 항목을 대신 추가할 수 있습니다. runtimeconfig.json 설정 이름을 Include 특성 값으로 사용합니다. 예를 들어 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 해당 없음 해당 없음 해당 없음
환경 변수 COMPlus_GCLargePages 0 - 사용 안 함
1 - 사용
.NET Core 3.0
환경 변수 DOTNET_GCLargePages 0 - 사용 안 함
1 - 사용
.NET 6

대형 개체 허용

  • 64비트 플랫폼에서 총 크기가 2기가바이트(GB)보다 큰 배열에 대한 가비지 수집기 지원을 구성합니다.
  • 기본값: GC가 2GB를 초과하는 배열을 지원합니다. 이는 값을 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바이트입니다.
  • 사용자가 지정하는 값은 기본 임계값보다 커야 합니다.
  • 이 값은 런타임에 의해 현재 구성에서 가능한 최대 크기로 제한될 수 있습니다. 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 항목을 대신 추가할 수 있습니다. runtimeconfig.json 설정 이름을 Include 특성 값으로 사용합니다. 예를 들어 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 해당 없음 해당 없음 해당 없음
환경 변수 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 항목을 대신 추가할 수 있습니다. runtimeconfig.json 설정 이름을 Include 특성 값으로 사용합니다. 예를 들어 msBuild 속성을 참조하세요.

app.config파일 예제:


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

다른 숫자로 실험하여 가장 적합한 값을 확인합니다. 5에서 7 사이의 값으로 시작합니다.