자바나 C#을 이용하던 사람들이면 가비지 컬렉터라는 개념을 한 번은 들어봤을 것이다.
메모리를 관리해주는 것은 알겠는데 어떤 방식으로 관리를 해주는지 자세히 모른다.
그렇기 때문에 가비지 컬렉터에 대한 개념을 설명하고자 한다.
1. 가비지 컬렉터란?
공용 언어 런타임에서 가비지 컬렉터는 자동 메모리 관리자 역할을 하는데 주로 메모리
할당 및 해제를 관리해준다. 그래서 따로 메모리를 할당 및 해제하는 코드를 작성하지
않아도 된다. ex) C++의 Malloc
2. 가비지 컬렉터 구성
가비지 컬렉터는 포인터가 담긴 가상 주소 공간이 있다. 하지만 이 공간은
CLR(공용 언어 런타임)에서 관리해주기 때문에 개발자가 건들일 필요가 없다.
가상 주소 공간은 관리되는 힙 즉, Managed Heap 이라고 부르고 이것을 통해
가상 메모리의 할당 및 해제를 관리한다.
가상 메모리의 상태
Free : 메모리 블록이 가상 메모리에 대한 참조가 없으며, 메모리 블록을 할당에 사용
예약됨 : 메모리 블록은 사용할 수 있으며 다른 할당 요청은 사용할 수 없다. 그러나 커밋될 때 까지
메모리 블록에 데이터 저장 가능
커밋됨 : 메모리 블록이 실제 스토리제에 할당
가상메모리를 상태에 따라 가상 주소 공간의 여유있는 블록에 할당하게 된다.
가상 메모리 관리자가 가상메모리를 할당할 수 있는 단일 사용 가능한 블록을 찾는다.
하지만 아무리 여유 공간이 충분해도 한 주소 블록에 있는 경우가 아니라면 할당에
실패할 수 있다. -> 가비지 컬렉터가 원활하게 돌아갈 수 있게 항시 여유 공간을 두고 작업한다.
3. 메모리 할당 및 해제
메모리 할당
개발자가 작업을 실행하면 CLR(공용 언어 런타임)에서 인접한 가상 주소 공간 영역을 만드는데
이를 매니저 힙이라고 부른다. 매니저 힙에는 다음 개체가 할당될 주소의 포인터를 관리하는데
이 포인터는 매니지 힙의 기본 주소로 설정된다. 그렇게 개체가 들어오게 되면 포인터를 사용하여
메모리를 할당하고 새로운 메모리가 들어오면 바로 이전 개체 다음 공간에 메모리를 할당한다.
메모리 해제
가비지 컬렉터는 애플리케이션의 루트를 검사하여 더 이상 사용되지 않는 개체를 결정한다.
루트는 스레드 스택의 지역변수, CPU레지스터, GC핸들, FInalize 큐를 포함한다. 이를
세부적으로 표현하자면
1. 가비지 컬렉터가 매니지 힙의 모든 메모리 영역을 검사한다.
2. 루트와 관련없는 개체를 찾아내면 메모리 복사기능을 실행
3. 루트와 연결할 수 있는 개체는 압축되고 연결할 수 없는 개체에 할당된 주소 공간 블록 해제
4. 압축된 개체로 인하여 가비지 컬렉터가 포인터의 위치를 수정
5. 애플리케이션 루트가 새 위치를 가리키며 힙의 포인터 위치를 연결할 수 있는 마지막 개체 다음으로 지정
요약
가비지 컬렉터는 자동으로 필요없는 동적 메모리를 해제 해주는 자동 메모리 관리자 기능입니다.
이는 관리되는 힙이라는 가상 주소 공간과 애플리케이션의 루트목록으로 메모리의 할당
및 해제를 관리합니다. 할당은 가리키고 있는 힙의 포인터 위치에 적용되고 해제는 루트와 관련없는
메모리를 찾아내어 진행합니다.
-> 메모리가 너무 많으면 압축을 진행하고 메모리를 해제, 관리 가능한 정도면 따로 압축을 하지 않고 메모리 해제 진행
'TIL > C#' 카테고리의 다른 글
[C#] 가비지 컬렉션(Garbage Collection) (0) | 2023.10.31 |
---|---|
[C#] 가비지 컬렉터 회피 전략 (0) | 2023.10.30 |
[C#] Struct와 Class의 차이점 (0) | 2023.10.26 |
[C#] 접근제한자의 종류와 차이점 (0) | 2023.10.25 |
ref와 out의 차이점 (0) | 2023.10.24 |