GC(Garbage Collection, 가비지 컬렉션)

agnusdei·2025년 7월 21일
0

ICT

목록 보기
25/143

GC(Garbage Collection, 가비지 컬렉션)는 더 이상 사용되지 않는 메모리를 자동으로 탐지하고 회수하여, 메모리 누수를 방지하고 안정적인 메모리 관리를 가능하게 하는 기술입니다.


✅ 1. GC(Garbage Collection)의 기본 개념

프로그래밍 언어에서 객체를 생성하면 힙(Heap) 메모리에 저장됩니다. 객체 사용이 끝난 후에도 명시적으로 제거하지 않으면 메모리가 낭비되거나 누수(Memory Leak)가 발생할 수 있습니다.

이를 방지하기 위해 GC는:

  • 사용하지 않는 객체를 탐지
  • 메모리에서 자동 제거
  • 힙 공간을 회수하여 재사용 가능하게 만듦

✅ 2. GC의 동작 방식

GC는 일반적으로 다음 세 단계를 거칩니다:

마킹(Marking)

  • 현재 참조 중인 객체를 탐색 (Reachability Analysis)
  • 루트(스택, static 변수 등)에서 출발하여 도달 가능한 객체만 "사용 중"으로 표시

제거(Sweeping or Deletion)

  • 참조되지 않는(도달 불가능한) 객체를 힙에서 제거

압축(Compaction) 또는 정리(Defragmentation)

  • 제거된 객체의 자리를 메꾸기 위해 살아 있는 객체들을 이동
  • 단편화를 줄여 성능 향상

✅ 3. GC의 주요 알고리즘

📌 1. Mark and Sweep

  • 가장 기본적인 방식
  • 장점: 간단
  • 단점: 메모리 단편화, GC 일시 중단(Pause)

📌 2. Generational GC (세대별 GC)많이 사용됨

  • 객체의 생애주기를 기반으로 메모리를 세대로 구분
  • Young (Eden + Survivor) / Old (Tenured)
  • Young Generation은 자주 GC, Old는 덜 자주

대표 예: Java HotSpot VM (G1, Parallel GC 등), .NET CLR

📌 3. Reference Counting (참조 카운트)

  • 객체에 참조 수를 부여해 0이 되면 삭제
  • 단점: 순환 참조(Circular Reference) 처리 불가

대표 예: Python, Objective-C, Swift (ARC)

📌 4. Tracing GC (추적 기반)

  • 루트 객체에서 참조 가능한 모든 객체만 유지
  • JVM, CLR, JavaScript 엔진(V8 등)에서 사용

✅ 4. 언어별 GC 방식 예시

언어GC 방식특징
JavaGenerational + TracingG1, ZGC, Shenandoah 등 다양함
PythonReference Counting + Cycle Detector순환 참조 탐지 추가
JavaScript (V8)Generational GC + Incremental + Concurrent짧은 GC 지연 목표
.NET (C#)Generational GC + CompactingBackground GC 지원
GoConcurrent Mark and Sweep + STW(Pause) 최소화Soft real-time GC
SwiftARC (Automatic Reference Counting)컴파일 타임 참조 관리

✅ 5. GC의 장단점

✔️ 장점

  • 메모리 관리 자동화
  • 메모리 누수 가능성 감소
  • 코드 단순화

❌ 단점

  • 예측 불가능한 GC Pause
  • 고성능 실시간 시스템에서는 부적합할 수 있음
  • 메모리/CPU 사용량 증가

✅ 6. GC 최적화 고려사항 (아키텍처 관점)

  • GC 튜닝: Java의 경우 -Xms, -Xmx, -XX:+UseG1GC 등으로 제어
  • 객체 생명 주기 단축: 불필요한 객체 오래 유지하지 않기
  • 객체 재사용: Object Pool, ThreadLocal, Flyweight Pattern 활용
  • 불변 객체 사용: 메모리 이동이 줄어들고 GC 부담 감소
  • GC 로그 분석: GC time, frequency, heap usage 등 모니터링

✅ 결론

GC는 메모리 관리를 자동화하여 개발자의 부담을 줄여주지만, 내부 구조와 알고리즘을 이해하지 못하면 예기치 못한 성능 저하가 발생할 수 있습니다. 특히 고성능 시스템, 대규모 트래픽 처리 시스템에서는 GC 알고리즘 선택, 힙 구조 설계, 튜닝 전략 등이 소프트웨어 아키텍처의 품질에 직결됩니다.

필요하시면 Java G1GC, Python의 gc 모듈 예제, 혹은 GC 로그 분석 방법도 안내드릴 수 있습니다.

profile
DevSecOps ⚙️ + Pentest 🚩

0개의 댓글