C# - 메모리와 가비지 컬렉터 (GC)

2025. 9. 17. 23:40·C#

C, C++ 에서는 프로그래머가 직접 balloc, free, new, delete 등을 호출해 메모리를 할당하고 해제해야 했다.

이 과정에서 메모리 누수(memory leak), 해제 후 접근(dangling pointer), 이중 해제(double free) 등 치명적인 오류가 발생할 위험이 있었다.

 

하지만 C#에서는 가비지 컬렉터(GC : Garbage Collector)라는 자동 메모리 관리 시스템이 도입되어 이러한 위험이 크게 줄어들었다.

객체를 new로 생성하기만 하면 되고, 더 이상 필요 없어지면 GC가 알아서 힙(heap) 메모리를 해제한다.

※그렇다고 GC를 맹신하기만 해선 안되니 주의하자.

 


메모리

 

스택 (Stack)

지역 변수, 매개변수 등이 저장되는 영역으로 함수 호출과 함께 자동으로 생성되고 해제된다.

속도가 빠르지만 크기가 제한적이다.

 

힙 (Heap)

new로 생성한 객체들이 저장되는 영역으로 수명이 불확실하다.

가비지 컬렉터(GC)가 주기적으로 검사해 더 이상 참조되지 않는 객체를 해제한다.

그렇기 때문에 관리 비용이 크다.

 


가비지 컬렉터 ( GC : Garbage Collector )

C#의 자동 메모리 관리 시스템이다.

힙(heap) 메모리에서 더이상 참조되지 않는 객체를 자동으로 해제해주는 편리한 기능이다.

 

GC는 생존 기간에 따라 객체를 분류한다.

Gen 0 : 새로 생성된 객체 (짧게 쓰고 금방 사라질 확률 높음). 살아남으면 Gen 1로 승격(promote)

Gen 1 : Gen 0 에서 살아남은 객체. Gen 1도 꽉 차면 GC는 Gen 1을 검사하고, 살아남은 객체는 Gen 2로 이동

Gen 2 : 장기간 참조되는 객체 ( ex: 싱글톤, 전역 컬렉션 등 ). 상대적으로 드물게 검사 (전체 힙 검사 비용이 크기 때문)

 

 

GC는 단순히 null 인지만 확인하는 게 아니다.

  • 루트(Root) 탐색 : 프로그램에서 현재 접근 가능한 참조(스택 변수, 정적 변수, CPU 레지스터 등)를 루트로 삼는다.
  • 도달 가능성 분석 : 루트에서 따라가며 닿을 수 없는 객체는 "죽은 객체"로 간주한다.
  • Mark & Sweep (표시 후 정리) : 살아 있는 객체에 표시(mark)를 하고, 나머지를 청소(sweep)한다.

이 과정이 끝나면 GC는 필요시 힙 메모리를 재배치(compaction)해서 파편화를 줄인다.

 

 

GC가 자동이라고 해도 몇가지 주의할 점이 있다.

 

큰 객체(LOH : Large Object Heap)

85,000 바이트 이상되는 객체는 일반 관리 힙이 아닌 별도의 힙에 저장한다.

작은 객체와 큰 객체를 같은 힙에 섞어두면 GC가 수집할 때 메모리 재배치(Compaction) 비용이 너무 커지기 때문이다.

그래서 큰 객체는 따로 모아둬서 GC의 영향을 최대한 지양하여 관리 효율을 높이는 것이다.

그런데 메모리 할당, 해제 과정이 반복되다 보면 빈 공간이 여러곳에 흩어져서 연속된 큰 공간을 잡을 수 없는 상태가 된다.

이것을 조각화(fragmentation)가 심해진다고 부른다.

 

Finalize vs Dispose

IDisposable.Dispose()를 구현해 명시적으로 자원(파일 핸들, DB 연결 등)을 반납하는 게 안전하다.

GC는 메모리 해제만 자동이지 외부 리소스는 자동으로 정리하지 않는다.

 

GC 발생 시점

GC는 알아서 돌지만 GC.Collect()를 직접 호출할 수도 있다

그러나 무분별하게 쓰면 성능 저하를 유발한다.

GC는 무거운 작업이므로 꼭 필요할 때만 쓰자.

'C#' 카테고리의 다른 글

C# - 클래스와 Static  (0) 2025.09.18
C# - 클래스와 구조체의 차이  (0) 2025.09.17
C# - 클래스 실습 문제 풀이 (생성자)  (0) 2025.09.17
C# - 생성자, 소멸자, 부분 클래스, 네임스페이스, 깊은 복사, 얕은 복사, 매개변수 한정자  (0) 2025.09.16
C# - 클래스 (Class) 생성 실습 문제 풀이  (0) 2025.09.15
'C#' 카테고리의 다른 글
  • C# - 클래스와 Static
  • C# - 클래스와 구조체의 차이
  • C# - 클래스 실습 문제 풀이 (생성자)
  • C# - 생성자, 소멸자, 부분 클래스, 네임스페이스, 깊은 복사, 얕은 복사, 매개변수 한정자
ellug
ellug
Web / App / Game Dev
  • ellug
    dev.ellug
    ellug
  • 전체
    오늘
    어제
    • 분류 전체보기 (95)
      • Javascript (React, Next) (1)
      • C# (66)
      • Graphics (1)
      • Unity (25)
      • 프로그래머스 (0)
        • Lv.0 (0)
        • Lv.1 (0)
        • Lv.2 (0)
        • Lv.3 (0)
      • AI Agent (0)
      • StableDiffusion (0)
      • ETC (1)
      • 잡담 (0)
      • 유머 (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    큐
    list
    struct
    최적화
    Design Pattern
    delegate
    콘솔
    게임
    유니티
    inputsystem
    unity
    추상 클래스
    Network
    interface
    클래스
    console
    Queue
    class
    네트워크
    firebase
    stack
    자료구조
    Photon
    useState
    Abstract
    터미널
    스택
    function
    C#
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
ellug
C# - 메모리와 가비지 컬렉터 (GC)
상단으로

티스토리툴바