가비지 수집을 위한 런타임 구성 옵션
이 페이지에는 .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으로 해석합니다. |
1 0x
접두사가 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 - 백그라운드 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 유지
이들 중 일부 설정에 대한 자세한 내용은 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
}
}
선호도 지정 범위
- 가비지 수집기 스레드가 사용할 프로세서 목록을 지정합니다.
- 이 설정은 64개가 넘는 프로세서를 지정할 수 있다는 점을 제외하면 System.GC.HeapAffinitizeMask와 비슷합니다.
- Windows 운영 체제에서는 번호 또는 범위 앞에 해당하는 CPU 그룹(예: “0:1-10,0:12,1:50-52,1:7”)을 붙입니다. 실제로 하나 이상의 CPU 그룹이 없는 경우 이 설정을 사용할 수 없습니다. 선호도 지정 마스크 설정을 사용해야 합니다. 지정한 숫자는 해당 그룹 내에 있으므로 >=64는 성립할 수 없습니다.
- CPU 그룹 개념이 없는 Linux 운영 체제의 경우 이 설정과 선호도 지정 마스크 설정을 모두 사용하여 동일한 범위를 지정할 수 있습니다. 그룹 인덱스를 지정할 필요가 없으므로 "0:1-10" 대신 "1-10"을 지정합니다.
- GC 프로세서 선호도를 사용하지 않도록 설정하면 설정이 무시됩니다.
- 서버 가비지 수집에만 적용됩니다.
- 자세한 내용은 Maoni Stephens의 블로그에서 Making CPU configuration better for GC on machines with > 64 CPUs(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 항목을 대신 추가할 수 있습니다. 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% 중 더 큰 값입니다.
- 개체별 힙 하드 제한이 구성된 경우 이 설정은 무시됩니다.
설정 이름 | 값 | 도입된 버전 | |
---|---|---|---|
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으로 지정합니다.
힙 하드 제한 비율
- 힙 하드 제한을 총 실제 메모리의 백분율로 지정합니다. 프로세스가 메모리 제한 환경에서 실행되는 경우, 즉 지정된 메모리 제한이 있는 컨테이너 내에서 총 실제 메모리는 메모리 제한입니다. 그렇지 않으면 컴퓨터에서 사용할 수 있는 것입니다.
- 이 설정은 64비트 컴퓨터에만 적용됩니다.
- 개체별 힙 하드 제한이 구성되거나 힙 하드 제한이 구성된 경우 이 설정은 무시됩니다.
설정 이름 | 값 | 도입된 버전 | |
---|---|---|---|
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_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 항목을 대신 추가할 수 있습니다. 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_GCHeapHardLimitSOHPercent
및DOTNET_GCHeapHardLimitLOHPercent
의 값도 지정해야 합니다. 그러지 않으면 런타임이 초기화되지 않습니다.DOTNET_GCHeapHardLimitSOH
,DOTNET_GCHeapHardLimitLOH
및DOTNET_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 구현 대신 독립 실행형 가비지 수집기를 사용하려면 경로(.NET 9 이상 버전) 또는 GC 네이티브 라이브러리의 이름을 지정할 수 있습니다.
Path
- 런타임이 기본 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.dll , Linux에서는 libcoreclr.so , OSX의 경우 libcoreclr.dylib ).
- 예를 들어 "를 지정하는 경우 값은 상대 경로일 수도 있습니다. Windows의 \clrgc.dll"이고, clrgc.dll .NET 런타임 디렉터리의 부모 디렉터리에서 로드됩니다.
.NET 9 이상 버전에서 이 값은 파일 이름만 지정합니다(경로는 허용되지 않음).
- .NET은 앱
Main
의 메서드가 포함된 어셈블리가 있는 디렉터리에서 지정한 이름을 검색합니다. - 파일을 찾을 수 없으면 .NET 런타임 디렉터리가 검색됩니다.
경로 구성이 지정된 경우 이 구성 설정은 무시됩니다.
설정 이름 | 값 | 도입된 버전 | |
---|---|---|---|
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 항목을 대신 추가할 수 있습니다. 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 속성을 참조하세요.
.NET