1. 가비지 컬렉션(Garbage Collecotr, GC)이란?
가비지 컬렉션은 사용하지 않는 메모리를 회수하여 시스템에서 재사용할 수 있도록 하는 C#의 자동화된 메모리 관리 메커니즘입니다. C#에서는 개발자가 C/C++에서와 같이 수동으로 메모리를 할당하고 할당 해제할 필요가 없습니다. 대신 .NET 런타임이 애플리케이션을 대신하여 메모리를 관리하므로 강력하고 안정적인 애플리케이션을 더 쉽게 작성할 수 있습니다.
2. 가비지 컬렉션의 동작 방식
가비지 컬렉션의 기본 개념은 간단합니다. 런타임은 애플리케이션에서 사용 중인 메모리를 주기적으로 검사하여 더 이상 도달할 수 없는, 즉 애플리케이션의 활성 부분에서 더 이상 참조하지 않는 개체를 식별합니다. 이러한 객체가 식별되면 런타임은 해당 메모리를 안전하게 회수하여 재사용할 수 있도록 합니다.
3. 그렇다면 가비지 컬렉션은 어떠할 떄 동작하는가?
C#에서 가비지 컬렉션은 프로그램에서 더 이상 필요하지 않은 객체의 할당을 해제하여 메모리를 자동으로 관리하는 프로세스입니다. C#에서 개체를 생성하면 런타임이 힙에 해당 개체에 대한 메모리를 할당합니다. 객체 사용이 끝나면 런타임은 객체가 더 이상 필요하지 않다고 판단되면 자동으로 메모리를 할당 해제합니다.
가비지 컬렉터는 마크 앤 스윕 알고리즘을 사용하여 더 이상 도달할 수 없는 객체를 식별합니다. 이 알고리즘은 정적 변수, 로컬 변수 및 CPU 레지스터를 포함하는 알려진 루트 집합으로 시작하여 작동합니다. 그런 다음 가비지 컬렉터는 이러한 루트에서 시작하여 도달 가능한 모든 오브젝트를 표시하면서 오브젝트 그래프를 순회합니다.
도달 가능한 모든 객체가 표시되면 가비지 컬렉터는 힙을 스윕하고 표시되지 않은 모든 객체의 할당을 해제합니다. 이렇게 하면 메모리를 효과적으로 회수하여 재사용할 수 있게 됩니다.
경우에 따라 가비지 컬렉터는 메모리에서 살아남은 객체를 서로 더 가깝게 이동시켜 조각화를 줄이고 메모리 로컬리티를 개선하는 압축 단계를 수행할 수도 있습니다.
3. 가비지 컬렉션의 동작 순서
C#의 가비지 컬렉터는 별도의 스레드에서 주기적으로 실행되는 방식으로 작동합니다. 각 수집 주기 동안 가비지 수집기는 다음 단계를 수행합니다:
마크(Mark): 가비지 수집기는 루트(정적 변수, 로컬 변수, CPU 레지스터 포함)부터 시작하여 도달 가능한 모든 객체에 마크를 표시하는 것으로 객체 그래프를 탐색합니다. 이 작업은 일반적으로 마크 앤 스윕 알고리즘을 사용하여 수행됩니다.
스윕(Sweep): 도달 가능한 모든 객체가 표시되면 가비지 컬렉터는 힙을 스윕하고 표시되지 않은 모든 객체의 할당을 해제합니다. 이렇게 하면 메모리를 효과적으로 회수하여 재사용할 수 있습니다.
컴팩트(Compact): 경우에 따라 가비지 컬렉터는 압축 단계를 수행하여 메모리에서 살아남은 객체를 서로 더 가깝게 이동하여 조각화를 줄이고 메모리 로컬리티를 개선할 수도 있습니다.
C#의 가비지 컬렉터는 고도로 구성 가능하며, 개발자는 다양한 매개변수를 제어하여 특정 애플리케이션에 맞게 동작을 최적화할 수 있습니다. 예를 들어 가비지 수집 주기의 빈도, 힙 크기, 생성 임계값을 설정할 수 있습니다.
가비지 컬렉션 작업 시 중요한 고려 사항 중 하나는 가비지 수집기가 객체를 회수하기 직전에 호출되는 특수 메서드인 파이널라이저를 사용하는 것입니다. 파이널라이저는 파일 핸들을 닫거나 다른 리소스를 해제하는 등의 정리 작업을 수행하
는 데 사용할 수 있지만 성능 문제나 버그를 유발하지 않도록 신중하게 사용해야 합니다.
4. 결론
전반적으로 C#의 가비지 컬렉션은 메모리 관리를 간소화하고 애플리케이션의 안정성을 개선하는 데 도움이 되는 강력한 메커니즘입니다. 메모리 할당 및 할당 해제 프로세스를 자동화함으로써 개발자는 저수준 메모리 관리 세부 사항에 대해 걱정할 필요 없이 고품질 코드 작성에만 집중할 수 있습니다.
전반적으로 C#의 가비지 컬렉션은 메모리 관리를 간소화하고 애플리케이션의 안정성을 개선하는 데 도움이 되는 강력한 메커니즘입니다. 메모리 할당 및 할당 해제 프로세스를 자동화함으로써 개발자는 저수준 메모리 관리 세부 사항에 대해 걱정할 필요 없이 고품질 코드 작성에만 집중할 수 있습니다.
'공부 > C#' 카테고리의 다른 글
모노비헤이비어(MonoBehavior)란? (0) | 2023.03.05 |
---|---|
C#의 구조체(struct)는 가비지 컬렉터의 대상인가요? (0) | 2023.03.05 |
오브젝트 타입에 벨류 타입을 대입하게 될 경우 어떤 현상이 발생할까? (0) | 2023.03.05 |
박싱과 언박싱이란? (0) | 2023.03.04 |
C#에서의 클래스(Class)와 구조체(Struct)의 차이점 (0) | 2023.03.04 |