C# 가비지 컬렉션(Garbage Collection)

Posted by 알 수 없는 사용자
2015. 3. 23. 23:19 프로그래밍/C#

C/C++ 프로그래밍에서는 메모리 할당과 해제를 개발자가 직접했어야 했다.

하지만 닷넷기반에서는 가비지컬렉션(GC)에 의해 메모리를 세대별로 나눠서 관리한다.

세대별로 나눠서 관리하는 이유는 GC가 동작하는 모든 객체를 조사하고 관리하는 비용이 크기 때문이다.

GC는 총 3가지 세대로 나눠서 관리를 한다.

0세대 : 처음 할당되는 객체는 모두 0세대에 속한다. 0세대의 용량이 일정 크기를 초과하면 GC는 가비지를 수집한다.

1세대 : 0세대에서 가비지 수집 시 계속 사용되는 객체가 있다면 1세대로 승격된다.

    1세대에서도 일정 크기의 용량을 초과하면 GC는 가비지를 수집하고 보통 0세대에서 컬렉션이 많이 발생한다.

2세대 : 1세대에서 가비지 수집 시 계속 사용되는 객체가 2세대로 승격된다.

    2세대 영역에서도 1세대와 마찬가지로 일정 크기의 용량을 초과하면 GC가 가비지를 수집한다.

GC가 수행되는 동안 모든 스레드 작업은 중단된다.

이는 더 이상 참조되지 않는 객체들을 해제하고 그 빈 공간을 채우기 위해 사용 중인 다른 객체들의 위치를 재 조정하기 때문이다.


GC의 동작

[그림 1]


[그림 2]

위 [그림 1]은 사용 중인 메모리 공간을 보여준다. 그리고 b는 d를 참조하고 있다고 가정한다.

만약 b = null, g = null 을 대입하고 GC가 수행되면 b, d, h가 삭제되어 [그림 2]와 같이 메모리가 해제된 빈 공간이 생기게 된다.


[그림 3]

b, d, h가 삭제되어 메모리공간이 비어있게 되면 메모리공간을 효율적으로 사용하기 위해 GC는 아직 사용 중인 객체들을 [그림 3]과 같이 재 배치한다.



[그림 4]

[그림 4]에서 보면 처음 0세대에서 GC가 수행된 후 남아있는 객체들은 1세대로 승격되고 추가로 생성된 객체(i, j, k)들은 0세대에 추가된다.

2세대까지의 승격도 위와 같은 방법으로 일어나고 0세대의 GC는 활발하게 일어나지만 1세대, 2세대로 갈 수록 빈도는 줄어든다.



출처 : 

시작하세요! C# 프로그래밍




'프로그래밍 > C#' 카테고리의 다른 글

C# Linq  (3) 2015.05.18
C# 람다식(Lamda Expression)  (9) 2015.04.11
C# 대리자(Delegate)  (288) 2015.04.08
C# 기본자료형, 변수  (10) 2015.03.22