[C#] 가비지 컬렉터


C++에서 클래스를 만드는 과정에 있어

가장 신경썻던 부분이 new/delete를 통한

메모리 할당/해제가 아니었나 생각이 든다.


할당은 그렇다 쳐도 해제하는 것을 까먹는다거나

해제한 줄도 모르고 그 포인터에 접근하는 경우가 발생한다.

때문에 스마트 포인터를 사용하여 이 문제를 극복하곤 하는데

c#에서는 가비지 컬렉터라는 멋진 놈이 이러한 문제를 해결해준다.




C/C++의 메모리 할당

C/C++는 힙에 객체를 할당하기 위해 C-런타임은 객체를

담기 위한 메모리를 여러 개의 블록으로 나눈 뒤, 이 블록을

연결 리스트로 묶어서 관리하게 된다.


어떤 객체를 힙에 할당하는 코드가 실행되면, C-런타임은

메모리 연결 리스트를 순차적으로 탐색하면서 해당 객체를

담을 수 있을 만한 여유가 있는 메모리 블럭을 찾는다.




적절한 크기의 메모리 블록을 만나면, 프로그램은 이 메모리

블록을 쪼개서 객체를 할당하고 메모리 블록의 연결리스트를

재조정한다. 따라서 메모리 공간에 데이터를 집어넣는다는 것은

1. 탐색 2. 분할 3. 재조정의 오버헤드가 필요하다는 것이다.




C#의 메모리 할당

C#은 CLR이 자동 메모리 관리 기능을 제공한다.

이 기능의 중심에는 가비지 컬렉션 (Garbage Collection) 이 있다.

가비지 컬렉션은 프로그래머로 하여금 컴퓨터가 무한한 메모리를

가지고 있는 것처럼 간주하고 코드를 작성할 수 있게 한다.

(여기서 가비지란 더 이상 사용하지 않는 객체)




CLR 안에는 이러한 가비지 컬렉션을 담당하는

가비지 컬렉터 (Garbage Collector)라는 놈이 있다.

가비지 컬렉터는 객체 중에 쓰레기인 것과 쓰레기가

아닌 것을 완벽하게 분리해서 쓰레기들만 수거한다.




하지만 가비지 컬렉터 역시 CPU와 메모리 자원을 소모한다.

때문에 가비지 컬렉터가 최소환으로 이 자원을 사용할 수 있게

만들 수 있다면 성능을 아낀 자원의 양만큼 끌어올릴 수 있게 된다.




그렇다면 가비지 컬렉터가 최소환으로 자원을 사용하게 만들기 위해

우선 가비지 컬렉터가 어떻게 동작하는지에 대한 메커니즘을 이해해야 한다.

포스팅이 길어질테니 여기서 끊고, 다음 포스팅에서 가비지 컬렉터의

동작 메커니즘에 대해 알아보도록 하겠다.





+ Recent posts