본문 바로가기

학위공부/기술면접대비

[기술면접]C# 가비지콜렉션(GC)

반응형

Garbage Collection

메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능. 할당된 힙 안의 객체들의 크기가 임계치를 넘어가는 순간 GC(Garbage Collection)을 수행하여 힙 메모리를 관리함.

GC가 수행되는 순간 현재 수행중인 Thread들을 모두 중단시키고 GC Thread를 활성화한다. GC Thread는 힙 상에서 사용 중인 객체 참조 그래프를 생성하고 사용 중인 객체의 위치를 재조정함으로써 사용하지 않는 객체들을 모두 힙 상에서 제거한다.

장점

  • 유효하지 않은 포인터 접근 방지
  • 포인터 이중 해제 방지
  • 메모리 누수 방지

단점

  • 어떤 메모리를 해제할 지 결정하는 데 비용이 든다
  • GC가 일어나는 타이밍이나 점유 시간을 미리 예측하기 힘들다
  • 할당된 메모리가 해제되는 시점을 알 수 없다

루트: 힙에 할당된 메모리의 위치를 참조하는 객체

.NET 애플리케이션이 실행되면 JIT 컴파일러가 이 루트들을 목록으로 만들고, CLR은 이 루트 목록을 관리하며 상태를 갱신. GC는 CLR이 관리하는 루트 목록을 참조해서 GC를 수행

GC 수행 순서

  1. 루트 목록을 순회하며 힙 객체와 루트간의 관계 여부 조사
  2. 어떤 루트와도 관계가 없는 힙을 삭제
  3. 쓰레기(삭제된 힙)가 차지하고 있던 공간을 밀어넣으며 힙 정리(외부 단편화 제거)

세대별 GC

CLR은 메모리를 ‘0, 1, 2’ 3개의 세대로 나누고 0세대는 빨리 사라질 것으로, 2세대는 오랫동안 살아남을 것으로 예상함

여기서 세대를 나누는 기준은 객체의 생성되고 지난 시간. 객체가 생성된지 얼마 안될수록 메모리에서 빨리 사라지고, 생성된지 오래 되었을수록 늦게 사라지는 것으로 가정함.

0세대의 메모리 임계치가 넘는 경우 0세대의 GC 수행

1세대의 메모리 임계치가 넘는 경우 0, 1세대의 GC 수행

2세대의 메모리 임계치가 넘는 경우 0, 1, 2 세대의 GC 수행. 이를 Full Garbage Collection이라고 부름

대형 객체 힙(LOH)

대형 객체는 일반적인 힙(소형 객체 힙)과 다른 영역에 할당됨

대형 객체 힙은 GC를 수행하고 난 뒤 메모리 정리 작업(외부단편화 제거)을 수행하지 않음

대형 객체 힙의 GC는 Full Garbage Collection을 수행함

반응형