🗑️ Garbage Collection (GC)
Garbage Collection (GC) 은 프로그래밍 언어에서 사용하지 않는 객체를 자동으로 정리하여 메모리를 최적화하는 기능입니다.
C/C++에서는 개발자가 직접 malloc/free, new/delete 로 메모리를 해제해야 하지만, Java, Python, C# 같은 언어에서는 GC가 자동으로 동작합니다.
✅ GC란?
- 정의: 더 이상 접근할 수 없는 객체를 찾아 메모리에서 제거하여 메모리 누수 방지 + 안정적 실행 보장.
- 장점: 메모리 해제를 자동화 → 생산성 ↑, 안정성 ↑.
- 단점: GC 수행 시 Stop-the-World(STW) 현상 발생 → 성능 저하 가능.
🔹 GC 기본 원리
- 객체 참조 여부를 추적하여 더 이상 사용되지 않는 객체를 제거
- 대표 기법:
- Reference Counting
- 객체마다 참조 카운트를 유지. 0이 되면 제거.
- 단점: 순환 참조(circular reference) 문제 해결 불가.
- Tracing GC (Reachability Analysis)
- 루트 객체(스택, 정적 변수 등)에서 도달 가능한 객체만 살려두고 나머지를 수거.
🔹 JVM의 Generational GC
Java에서는 객체의 생명 주기 특성을 이용해 세대별로 나누어 관리합니다.
- Young Generation
- 새로 생성된 객체가 위치
- Minor GC 수행 (자주 발생, 짧고 빠름)
- Old Generation
- 오래 살아남은 객체가 승격되어 위치
- Major GC 수행 (비교적 느리고 무거움)
- Permanent Generation / Metaspace
- 클래스 메타데이터 저장 공간 (Java 8부터 Metaspace로 교체)
📌 동작 원리
- 대부분의 객체는 금방 사라진다 → Young Gen에서 바로 수거
- 자주 살아남는 객체는 Old Gen으로 승격 → 관리 효율 ↑
🔹 다양한 GC 알고리즘
| 알고리즘 | 특징 | 장점 | 단점 |
|---|
| Serial GC | 단일 스레드 | 단순, 작은 메모리에서 효율 | 큰 메모리에서 STW ↑ |
| Parallel GC | 멀티스레드 | Throughput ↑ | STW 길어질 수 있음 |
| CMS (Concurrent Mark-Sweep) | 마크와 스윕을 병렬 수행 | STW ↓ | 메모리 단편화 발생 |
| G1 GC (Garbage First) | 영역을 나눠 수거 | 예측 가능한 STW, 대용량 힙 적합 | 상대적으로 복잡 |
| ZGC, Shenandoah | 최신 저지연 GC | 매우 짧은 STW | 상대적으로 메모리 오버헤드 ↑ |
🔹 GC 관련 주요 용어
- Stop-the-World(STW): GC가 실행될 때 모든 애플리케이션 스레드가 멈추는 현상
- Minor GC: Young Generation에서의 수거
- Major/Full GC: Old Generation 포함 전체 수거
- Compaction: 단편화된 메모리를 연속되게 재배치
- Promotion: Young → Old 세대로 객체 이동

🔹 성능 최적화 포인트
- 객체 생성 최소화: 불필요한 객체를 만들지 않는다.
- StringBuilder 사용: 불변 객체(String) 대신 가변 객체 활용.
- 캐시 활용: 재사용 가능한 객체는 재활용.
- GC 튜닝: 애플리케이션 성격에 맞는 GC 알고리즘 선택 (Throughput vs Low Latency).
🚀 GC는 자동 메모리 관리의 핵심이지만, 성능과 직결되므로 언어별 동작 방식, 알고리즘 차이, 튜닝 방법을 구체적으로 알면 더 좋습니다.