출처 : https://nabacg.wordpress.com/2013/05/13/gc-background-vs-concurrent-mode/
번역이며 오역이 있을 수 있습니다.
저는 최근 .NET에서 Garbage Collection에 대해 많은 것을 읽었습니다. 프로젝트 중 하나에서 메모리 누출을 연구하고 점점 더 많은 MSDN 기사를 읽었습니다. 놀랍게도 지난 번에 주제에 대해 괴롭힘을당한 이후로이 지역에 새로운 개발이 많이있었습니다. 그래서 다른 사람들이 유용하다고 생각할 때 나중에 참조 할 수 있도록 그들을 요약 해 보겠습니다. 이 MSDN 기사 에서 CLR의 현재 GC 상태에 대한 개요를 찾을 수 있으므로 자유롭게 시작할 수 있습니다.
워크 스테이션 대 서버
실제로 두 가지 모드 가비지 콜렉션이 있습니다.이 모드는 구성 파일의 런타임 구성 부분에서 gcServer 태그를 사용하여 제어 할 수 있습니다. 워크 스테이션 가비지 콜렉션은 기본적으로 gcServer = "true"로 설정하더라도 단일 프로세서 시스템에서 항상 사용됩니다.
1 2 삼 4 5 | < configuration > < runtime > < gcServer enabled = "true|false" /> </ runtime > </ configuration > |
그 모드는 실제로 꽤 오래되었습니다. gcServer 태그는 .NET 2.0에 도입되었으며 따라서 CLR의 두 번째 버전입니다. 주요 차이점은 서버 모드에서 GC를 수행하는 스레드가 1 개 이상 있고 모두 THREAD_PRIORITY_HIGHEST 우선 순위 수준 에서 실행 된다는 것 입니다. GC 전용 스레드와 각 CPU에 대한 별도의 힙 (일반 및 대형 오브젝트 모두)이 있으며 이들 모두는 동시에 수집됩니다. 여기서 우선 순위가 높은 여러 스레드를 사용하여 최대한 빨리 컬렉션을 만들려고하지만 모든 사용자 스레드가 준비 될 때까지 일시 중지해야한다는 것을 의미합니다. 일반적으로 응답 속도보다 처리량이 높은 서버 응용 프로그램에 더 적합합니다. 이는 일반적인 데스크톱 응용 프로그램의 경우가 아닙니다. 서버 모드는 리소스를 많이 소비 할 수도 있습니다.
동시 vs 백그라운드
서버 vs 워크 스테이션 외에도 동시 및 백그라운드 작업 모드가 있습니다. 둘 다 사용하면 모든 사용자 스레드를 일시 중지하지 않고 전용 스레드가 2 세대를 수집 할 수 있습니다. 0 세대와 1 세대는 모든 사용자 스레드를 일시 중지해야하지만 항상 빠릅니다. 이는 물론 애플리케이션이 제공 할 수있는 대응 수준을 높입니다. 실제 모드는 다양하며 서버 대 워크 스테이션 유형의 GC에 따라 달라질 수 있습니다. 다음 섹션에서 자세히 설명합니다. 조금 혼란 스러울 수 있으므로 아래에서 가능한 모든 조합을 찾을 수 있습니다.
워크 스테이션 가비지 수집은 다음과 같습니다.
- 병발 사정
- 배경
- 비 동시성
서버 가비지 수집 옵션은 다음과 같습니다.
- 배경
- 비 동시성
동시 모드
Workstation GC의 기본 모드이며 다중 프로세서 시스템에서도 GC를 수행하는 전용 스레드를 제공합니다. gcConcurrent 태그 를 사용하여 끌 수 있습니다 .
1 2 삼 4 5 | < configuration > < runtime > < gcConcurrent enabled = "true|false" /> </ runtime > </ configuration > |
이 모드는 병행 GC 동안 제한된 할당 기능을 희생시켜 가장 많은 시간을 소비하는 Gen2 수집이 동시에 수행되므로 사용자 스레드 일시 중지가 훨씬 짧아집니다. Gen2 수집이 진행되는 동안 다른 스레드는 새로운 임시 메모리 세그먼트를 할당 할 수 없기 때문에 현재 임시 세그먼트의 한도까지만 할당 할 수 있습니다. 현재 세그먼트에서 프로세스가 제대로 실행되지 않으면 모든 스레드를 일시 중지하고 동시 수집이 완료 될 때까지 기다려야합니다. 동시 GC가 아직 진행 중일 때 Gen0 및 Gen1 컬렉션을 수행 할 수 없기 때문입니다. 또한 동시 GC에는 약간 더 높은 메모리 요구 사항이 있습니다.
백그라운드 모드 .NET 4.0
에는 새로운 백그라운드 모드가 도입되었습니다.이 모드는 동시 모드와 비슷한 개념을 가지고 있지만, 동시 모드를 대체해야하기 때문에 기본적으로 설정되어 있습니다. Concurrent는 Workstation에서만 사용할 수있는 반면 Workstation 및 Server 모드에서도 사용할 수 있습니다. 배경 모드가 실제로 Gen2 및 Gen1 컬렉션을 수행하면서 동시에 Gen2를 수행 할 수 있다는 큰 개선점이 있습니다. 이제 gen0, gen1 모음을 전경 모음이라고합니다. 사용자 스레드가 실행 중일 때 별도의 스레드에 의해 2 세대 콜렉션 만 수행되고, 포 그라운드 콜렉션은 모든 사용자 스레드를 일시 중지해야합니다. 또한 전경 컬렉션에는 배경 컬렉션에서 일시 중지가 필요하며, 그래서 그들은 다양한 안전 포인트를 통해 서로 상호 작용합니다. 백그라운드 컬렉션은 서버 GC에서 사용할 수 있으며 .NET 4.5로 시작하는 기본 모드입니다. 서버와 워크 스테이션 백그라운드 모드의 주요 차이점은 백그라운드 GC를 수행하는 스레드의 수입니다. 워크 스테이션에서는 항상 단일 스레드이고 서버 GC에서는 CPU 당 전용 스레드가 있습니다.