[C#] 가비지 컬렉터 (3)

Flaming Bun·2025년 7월 10일

C#

목록 보기
28/35

참고 사이트 : https://learn.microsoft.com/ko-kr/dotnet/standard/garbage-collection/fundamentals

GC의 세대

GC(가비지 컬렉션)는 힙을 3개의 세대로 나눈다.


0세대

  • 새 객체, 수명이 짧은 객체.
  • 임시 변수 등이 포함되며 가장 자주 수집된다.
  • 0세대에서만 컬렉션을 수행해도 새 객체를 만들 수 있는 충분한 메모리를 확보하기도 한다. (대부분의 객체는 0세대에서 회수된다.)

1세대

  • 0세대에서 살아남은 객체는 수준이 올라 1세대와 2세대에 저장된다.
  • 수명이 중간인 객체가 많다.
  • 0세대와 2세대 사이의 버퍼 역할을 한다.

2세대

  • 오래 살아남은 객체들이 있다.
  • 애플리케이션이 끝날 때까지 유지되는 데이터(예: 정적 데이터) 등이 있다.

대형 객체 힙(LOH)

  • 3세대라고도 하며, 2세대 수집 시 함께 처리된다. (일반적으로 압축되지 않음)


유지 및 승격

새 객체는 0세대에 할당되며, 살아남을 경우 점차 상위 세대로 승격된다.

GC는 주로 0세대에서 자주 발생하며, 세대별로 효율적으로 메모리 회수된다.

예) 0세대 수집 후 메모리 부족하면 1세대, 2세대 순으로 수집.



세대를 나누는 이유

  • 대부분 객체는 금방 필요 없어지기 때문이다.

  • 수명이 긴 객체와 짧은 객체를 구분해, 성능을 최적화하기 위해서다.



GC의 동작

GC는 모든 객체 중 '활성 객체(참조 중인 객체)'만 추적해, 나머지(비활성 객체)의 메모리를 회수한다.

가비지 수집은 다음 단계들로 구성된다.

- 활성 객체 표시 단계

- 참조를 업데이트하는 재배치 단계

- 비활성 객체 공간 회수 및 남은 객체를 압축하는 단계



관리되지 않는 리소스

파일 핸들, 네트워크 연결 등은 가비지 컬렉터가 자동으로 정리하지 못한다.

이런 리소스를 사용하는 객체는 반드시 Dispose 메서드를 구현/호출해 명시적으로 해제해야 한다.

실수로 호출하지 않은 경우를 대비해 Finalize 메서드를 통해 해제하는 방법도 존재한다.

0개의 댓글