[C#] GC (Garbage Collection) 본문

프로그래밍/C#

[C#] GC (Garbage Collection)

디유비 2020. 6. 29. 01:09

가비지 컬렉터

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
Comments