C# 가비지 컬렉션(Garbage Collection)
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 |