GC
프로그램에서 더 이상 사용되지 않는 메모리를 자동으로 탐지하고 해제하는 메모리 관리 기법입니다.
왜 필요한가?
C/C++: 개발자가 직접 메모리 할당/해제
→ 해제 안 하면 메모리 누수(Memory Leak)
→ 이미 해제된 메모리 접근 시 오류
Java, Python 등: GC가 자동으로 메모리 관리 O
GC 대상 판별 방식
객체를 참조하는 수를 카운팅
→ 카운트가 0이 되면 수거
단점: 순환 참조 시 카운트가 0이 되지 않아 수거 불가
A → B → A (서로 참조)
GC Root에서 시작해 참조를 따라가며 도달 가능한 객체 탐색
→ 도달 불가능한 객체 = 수거 대상
GC Root: 스택 변수, 정적 변수, JNI 참조 등
Java의 GC - 힙 구조
┌─────────────────────────────────────┐
│ Young Generation │
│ ┌────────┐ ┌────────┬──────────┐ │
│ │ Eden │ │Survivor│Survivor │ │
│ │ │ │ S0 │ S1 │ │
│ └────────┘ └────────┴──────────┘ │
├─────────────────────────────────────┤
│ Old Generation │
└─────────────────────────────────────┘
| 영역 | 설명 |
| Eden | 새로 생성된 객체 저장 |
| Survivor | Eden에서 살아남은 객체 |
| Old | 오래 살아남은 객체 |
1. 객체 생성 → Eden 영역 저장
2. Eden 꽉 참 → Minor GC 발생
3. 살아남은 객체 → Survivor 이동
4. 반복 생존 객체 → Old 영역 이동
5. Old 꽉 참 → Major GC(Full GC) 발생
GC 알고리즘
| 알고리즘 | 설명 | 특징 |
| Serial GC | 단일 스레드 수거 | 단순, 소규모 적합 |
| Parallel GC | 멀티 스레드 수거 | Java 8 기본값 |
| G1 GC | 힙을 Region으로 분할 | Java 9+ 기본값 |
| ZGC | 초저지연 GC | Java 15+ |
STW (Stop The World)
GC 실행 중 모든 애플리케이션 스레드 중단
→ GC 성능 튜닝의 핵심 목표는 STW 시간 최소화
장단점
| 장점 | 단점 |
| 메모리 누수 방지 | STW로 인한 일시적 성능 저하 |
| 개발 생산성 향상 | GC 실행 시점 예측 불가 |
| 안전한 메모리 관리 | 메모리 즉시 해제 보장 안됨 |
Java에서는 G1 GC가 기본으로 사용되며, 지연 시간이 중요한 서비스에서는 ZGC 도입을 고려합니다.