[C#] GC (Garbage Collection) 본문
가비지 컬렉터
C#은 managed language이다. 즉 메모리가 관리되는 언어라는 것이다.
이 메모리를 관리하기 위해 CLR안에는 가비지 컬렉터라는 게 존재한다.
하지만. 가비지 컬렉터도 CPU와 메모리 같은 컴퓨팅 자원을 소모한다.
가비지 컬렉터가 자원을 최소한으로 사용하게 만들기 위해서는 프로그래머가 가비지 컬렉터가 어떻게 동작하는지를 알고 있어야 한다.
(C#으로 Unmanaged Code를 작성하고 싶다면 unsafe 키워드를 사용하면 된다.)
C#은 실행파일을 실행하면 이 프로그램을 위한 일정 크기의 힙 메모리를 확보한다.
객체를 할당하면 메모리 포인터가 움직여서 다음 객체를 할당할 곳을 가리키게 된다.
할당된 메모리의 위치를 참조하는 객체를 Root라고 함.
. NET 애플리케이션이 실행되면 JIT 컴파일러가 루트들의 목록을 만들고, CLR은 이 루트 목록을 관리하며 상태를 갱신한다.
1. 가비지 컬렉터는 모든 객체가 쓰레기라고 가정(루트 목록 내의 어떤 루트도 메모리를 가리키지 않는다고 가정)
2. 루트 목록을 순회하면서 각 루트가 참조하고 있는 힙 객체와의 관계 여부를 조사( 루트 -> 힙 객체 -> 다른 힙 객체 이런 관계 파악)
3. 어떤 루트와도 관계가 없는 힙 객체는 쓰레기로 간주하고 비어 있는 공간으로 만듦
4. 루트 목록 조사가 전부 끝나면 비어있는 공간에 인접 객체들을 이동시켜 채워 넣음 -> 깨끗
프로그래머가 할 일?
- 객체를 너무 많이 할당하지 않는다.
- 너무 큰 객체 할당을 피한다.
- 너무 복잡한 참조 관계를 만들지 않는다.
- 루트를 너무 많이 만들지 않는다.
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 프로퍼티 (0) | 2020.06.28 |
---|---|
[C#] interface vs abstract class (0) | 2020.06.28 |
[C#] Generic을 쓰자 (0) | 2020.06.28 |