Learning
토픽 54 / 85·메모리 관리

가비지 컬렉션 (Garbage Collection)

가비지 컬렉션 (Garbage Collection)

프로그램 실행 중 더 이상 참조되지 않는 동적 할당 메모리를 자동으로 식별하고 해제하는 메모리 관리 기법으로, 프로그래머의 수동 메모리 해제 부담을 제거

목적: 자동 메모리 회수, 메모리 누수 방지, 댕글링 포인터 제거, 개발 생산성 향상

특징: 자동 메모리 관리, 실행 시 오버헤드, Stop-the-World 발생 가능, 비결정적 해제 시점

GC 알고리즘

  • Reference Counting: 참조 수 추적, 0이면 해제, 순환 참조 문제, Python/Swift/Objective-C
  • Mark-and-Sweep: 루트에서 도달 가능 객체 마킹 → 미마킹 객체 해제, 단편화 발생
  • Mark-and-Compact: Mark-Sweep + 살아있는 객체를 메모리 한쪽으로 압축, 단편화 해결
  • Copying GC: 메모리를 두 영역(From/To)으로 나눠 살아있는 객체만 복사, 빠르지만 메모리 50% 낭비
  • Generational GC: 세대별 분리(Young/Old), 대부분 객체는 젊은 세대에서 소멸(약한 세대 가설), Minor GC/Major GC

JVM GC 종류

  • Serial GC: 단일 스레드, 소규모 애플리케이션
  • Parallel GC: 다중 스레드, 처리량 중시
  • CMS(Concurrent Mark-Sweep): 저지연, 동시 마킹, 단편화 문제
  • G1 GC: 리전 기반, 예측 가능 지연시간, Java 9+ 기본
  • ZGC: 초저지연(10ms 이하), TB급 힙, 동시 처리, Java 15+
  • Shenandoah GC: 동시 압축, 저지연, Red Hat

Stop-the-World(STW): GC 수행 시 모든 애플리케이션 스레드 일시 정지, 지연시간 원인

GC 튜닝: 힙 크기 조정, 세대 비율, GC 알고리즘 선택, STW 시간 모니터링

비교: Reference Counting(즉시회수/순환참조문제) vs Tracing GC(주기적/STW/순환참조해결)

장점: 메모리 누수 방지, 안전성 향상, 개발 생산성, 댕글링 포인터 제거

단점: STW 지연, CPU 오버헤드, 메모리 사용 증가, 비결정적 해제 시점

적용사례: Java(JVM GC), Python(Reference Counting+Cycle Detection), Go(Tri-color), JavaScript(V8 Generational), .NET(CLR GC)

연관: 메모리 관리, 힙, 스택, JVM, 동적 메모리 할당