가비지 컬렉션 이란?
가비지 컬렉션, GC라고 줄여서도 부른다
이번엔 가비지 컬렉션(Garbage Collection)에 대한
기본적인 원리를 알아보고 C#에서의 메모리 할당과
해제과정에 대해 알아보고자 한다.
우선 시작하기 전에 기본적인 메모리
구조에 대해 알고 온다면 좋을 것 같다
가비지 컬렉션을 한국어로 직역하자면
"쓰레기 수거"라는 뜻으로, 여기서 정의한
쓰레기는 더 이상 사용되지 않는 객체를 말한다.
C, C++ 와 같은 언어들은 C# 과는 달리
자동 메모리 관리 기능 (Automatic Memory Management)
을 제공하지 않고 프로그래머가 직접 메모리를 할당해주고
해제해주는 작업을 거치게 된다
대표적으로 C와 C++ 에는 malloc, new
free, delete 등이 있다.
그리하여 우리가 실제로 가비지 컬렉터에 의한 부담을
최소한으로 하여 효율적으로 동작하게 하기 위해선
가비지 컬렉터가 어떻게 동작하는지에 대한
메커니즘을 이해하고 있어야 한다.
동작 메커니즘
C#에서 new 키워드를 통해 객체를 생성하게 되면 메모리 구조상
힙(Heap) 공간에 객체가 할당되게 된다.
메모리의 첫 영역부터 차례로 할당되게 되는데
CLR(Common Language RunTime)은
다음 객체를 할당할 메모리의 포인터가
새롭개 할당되어 공간을 차지하고 있는 곳
바로 뒤에 이동시킨다.


여기서 obj2 객체가 null이 되어 더 이상 사용하지 않은 메모리가
되어버리면 가비지 컬렉터에 의한 메모리 해제 대상이 된다.
사실 new 로 할당한 객체는 힙(Heap) 영역뿐만 아닌
Stack(스택) 영역에도 저장이 되는데 이는 객체의
주소가 스택 영역에 저장이 된다.
이렇게 할당된 메모리의 위치를 참조하는
객체를 일컬어 루트(Root)라고 부른다.
루트는 스택에서 생성될수도 있지만
정정 필드처럼 힙에 생성될 수 있다.
루트는 가비지 컬렉터에겐 매우 중요한
존재라고 볼 수 있다, 왜냐면 가비지
컬렉터가 CLR이 관리하던 루트 목록을
참조하여 쓰레기 수집을 하기 때문이다.
아래는 가비지 컬렉터가 루트 목록을
이용해 객체를 정리하는 과정이다.
- 작업을 시작하기 전, 모든 객체를 쓰레기로 가정
- 루트 목록을 순회하며 루트가 참조하는 힙 객체와의 관계 여부를 조사 이때 관계가 없는 객체는 쓰레기로 간주
- 쓰레기는 수거되어 메모리상에서 빈공간으로 됨
- 비어있는 공간을 인접 객체들을 이동시켜 재배치


장단점
직접 할당, 해제해주는 작업을 되게 불편하다고
생각할 수 있는데 분명 각각의 장단점이 존재한다
가비지 컬렉터가 없는 환경에서는 객체가 해제되는
지점을 정확하게 파악할 수 있어, 소멸자 등과 같은
함수들을 자유롭게 사용할 수 있지만
반면 가비지 컬렉터가 있는 환경에서는 런타임 도중
객체가 할당되는 지점은 정확히 알 수 있지만
해제되는 지점은 가비지 컬렉터가 직접 판단하여
해제하기 때문에 그 지점을 정확하게 알 수 없어
소멸자 사용도 제한적일 수밖에 없다.
하지만 가비지 컬렉터는 프로그래머에 의한
메모리 관리 실수는 줄일 수 있어 비교적
메모리 누수(memory leak) 현상이
적게 발생한다.
레퍼런스 사이트
https://docs.microsoft.com/ko-kr/dotnet/standard/garbage-collection/
.NET 가비지 수집
.NET의 가비지 수집에 대해 알아보세요. .NET 가비지 수집기는 애플리케이션의 메모리 할당 및 해제를 관리합니다.
docs.microsoft.com
'C# > 지식' 카테고리의 다른 글
| [C#] 비동기 프로그래밍(Asynchronous Programming) 에 대해 알아보자 (0) | 2022.01.09 |
|---|