.NET Core-가비지 수집
이 장에서는 .NET 관리 코드 플랫폼의 가장 중요한 기능 중 하나 인 가비지 수집의 개념을 다룰 것입니다. GC (가비지 수집기)는 메모리 할당 및 해제를 관리합니다. 가비지 수집기는 자동 메모리 관리자 역할을합니다.
메모리를 할당 및 해제하거나 해당 메모리를 사용하는 개체의 수명을 관리하는 방법을 알 필요가 없습니다.
"new"키워드로 개체를 선언하거나 값 유형이 boxing 될 때마다 할당이 이루어집니다. 할당은 일반적으로 매우 빠릅니다.
객체를 할당 할 메모리가 충분하지 않은 경우 GC는 가비지 메모리를 수집하고 폐기하여 메모리를 새 할당에 사용할 수 있도록해야합니다.
이 프로세스는 garbage collection.
가비지 컬렉션의 장점
가비지 컬렉션은 다음과 같은 이점을 제공합니다.
응용 프로그램을 개발하는 동안 메모리를 수동으로 해제 할 필요가 없습니다.
또한 관리되는 힙에 개체를 효율적으로 할당합니다.
개체가 더 이상 사용되지 않으면 메모리를 지워 해당 개체를 회수하고 향후 할당에 사용할 수있는 메모리를 유지합니다.
관리되는 개체는 자동으로 깨끗한 콘텐츠를 가져 오므로 생성자가 모든 데이터 필드를 초기화 할 필요가 없습니다.
또한 개체가 다른 개체의 내용을 사용할 수 없도록하여 메모리 안전을 제공합니다.
가비지 수집 조건
가비지 수집은 다음 조건 중 하나가 참일 때 발생합니다.
시스템의 실제 메모리가 부족합니다.
관리되는 힙의 할당 된 개체가 사용하는 메모리가 허용 가능한 임계 값을 초과합니다. 이 임계 값은 프로세스가 실행됨에 따라 지속적으로 조정됩니다.
그만큼 GC.Collect메서드가 호출되고 거의 모든 경우 가비지 수집기가 계속 실행되기 때문에이 메서드를 호출 할 필요가 없습니다. 이 방법은 주로 고유 한 상황 및 테스트에 사용됩니다.
세대
.NET 가비지 콜렉터에는 3 세대가 있으며 각 세대에는 할당 된 오브젝트의 스토리지에 사용되는 자체 힙이 있습니다. 대부분의 개체는 수명이 짧거나 수명이 긴 기본 원칙이 있습니다.
1 세대 (0)
0 세대에서는 개체가 먼저 할당됩니다.
이 세대에서 개체는 다음 가비지 수집이 발생할 때까지 더 이상 사용되지 않기 때문에 (범위를 벗어남) 1 세대 이후에는 살지 않는 경우가 많습니다.
0 세대는 연관된 힙이 작기 때문에 빠르게 수집합니다.
2 세대 (1)
1 세대에서는 개체에 두 번째 기회 공간이 있습니다.
수명이 짧지 만 0 세대 컬렉션에서 살아남은 개체 (종종 우연한 타이밍에 기반 함)는 1 세대로 이동합니다.
1 세대 컬렉션도 관련 힙도 작기 때문에 빠릅니다.
개체가 수집되거나 차세대 힙으로 승격되기 때문에 처음 두 힙은 작게 유지됩니다.
3 세대 (2)
2 세대에서는 모든 긴 개체가 유지되고 힙이 매우 커질 수 있습니다.
이 세대의 개체는 오래 지속될 수 있으며 개체를 추가로 승격 할 차세대 힙이 없습니다.
Garbage Collector에는 LOH (Large Object Heap)라고하는 대형 개체에 대한 추가 힙이 있습니다.
85,000 바이트 이상의 개체를 위해 예약되어 있습니다.
대형 오브젝트는 세대 별 힙에 할당되지 않지만 LOH에 직접 할당됩니다.
2 세대 및 LOH 콜렉션은 장시간 실행되거나 많은 양의 데이터에 대해 작동하는 프로그램의 경우 눈에 띄는 시간이 걸릴 수 있습니다.
대형 서버 프로그램은 수십 GB의 힙을 가지고있는 것으로 알려져 있습니다.
GC는 프로그램 실행을 차단하는 시간을 줄이기 위해 다양한 기술을 사용합니다.
기본 접근 방식은 프로그램 실행을 방해하지 않는 방식으로 백그라운드 스레드에서 가능한 한 많은 가비지 수집 작업을 수행하는 것입니다.
GC는 또한 개발자가 동작에 영향을 미칠 수있는 몇 가지 방법을 제공하므로 성능을 향상시키는 데 매우 유용 할 수 있습니다.