C#의 가비지 컬렉터는 메모리를 3개의 세대로 나누어 관리합니다.
0세대는 메모리에 최초 할당되는 객체들입니다. 0세대의 용량이 일정 크기를 초과하면 가비지 컬렉터가 다음과 같은 순서로 일을 시작합니다.
1. 메모리에서 참조되고 있는 객체를 검색합니다.
이 과정을 통해 참조 그래프를 만들어냅니다. 참조 그래프는 다음과 같은 각 스레드에서 실행중인 메소드의 스택 변수, cpu 레지스터 변수가 가지고 있는 참조
2. 참조 되지 않은 메모리들에 대한 마무리를 시도합니다.
3. 참조 되지 않는 객체들을 해제하고 그 메모리를 회수합니다. (해제, 메모리 회수의 과정은 계속 참조 되는 객체들에 대한 힙 영역 재배치, 메모리 할당 포인터를 감소시키는 과정으로 이루어집니다.)
가비지 컬렉터가 활동하는 동안 모든 스레드 작업은 중단되며 해제된 빈 공간을 채우기 위한 객체 위치 조정 또한 이루어집니다.
위의 과정이 이루어지고 계속 사용중인 객체들은 1세대로 승격됩니다.
1세대 또한 할당된 객체들이 일정 크기를 초과하면 가비지 컬렉터의 활동이 시작됩니다.
이는 0세대에서 활동한 방식과 동일하며 여전히 참조 중인 객체가 있다면 2세대로 승격됩니다.
2세대의 경우 일정 크기 초과 시 모든 세대에 대한 가비지 컬렉터 활동이 일어납니다.
단 유니티에서 사용하는 모노의 가비지 컬렉터는 세대를 나누지 않고 단일 세대에서의 가비지 컬렉터 활동을 합니다.
'기본소양' 카테고리의 다른 글
C#에서의 오버로딩과 오버라이딩 그리고 new (0) | 2019.03.15 |
---|