GC(Garbage Collection)는 Java 및 기타 고급 언어에서 더 이상 사용되지 않는 객체를 자동으로 메모리에서 정리해주는 기능입니다.
즉, 프로그래머가 직접 free() 같은 메모리 해제를 하지 않아도 되게 만들어주는 자동 메모리 관리 시스템입니다.
아래는 실무, 성능, TA 관점까지 반영하여 설명드립니다.
✅ 1. GC란? (기본 개념)
구분설명
| 목적 | 사용되지 않는 객체를 정리해 힙(Heap) 메모리 누수 방지 |
| 타이밍 | JVM이 메모리 부족 또는 일정 조건에서 자동 수행 |
| 대상 | 더 이상 참조되지 않는 객체(=Unreachable Object) |
| 관리 영역 | 주로 Heap 메모리 영역을 대상으로 함 |
✅ 2. GC의 주요 동작 과정
- 객체 생성
- new 연산자 등을 통해 Heap에 객체 생성됨
- 객체 참조 확인
- JVM은 "어떤 객체가 여전히 쓰이는가?"를 **루트(Root Set)**에서 따라가며 확인
- 참조되지 않는 객체는 Garbage로 간주
- GC 수행
- 참조되지 않는 객체를 정리하여 Heap 공간 회수
- GC 로그 출력 (선택적 설정)
✅ 3. GC의 주요 알고리즘 유형
유형특징사용 영역
| Serial GC | 단일 스레드 GC | CPU가 적은 환경, 테스트 환경 |
| Parallel GC | 다중 스레드로 GC | Throughput 중심 환경 |
| CMS (Concurrent Mark-Sweep) | 앱 실행과 GC를 병렬로 수행 | GC 지연 최소화 필요할 때 |
| G1 GC | Region 기반 정교한 GC, Full GC 방지 | 대규모 Heap, 최근 JVM 기본값 |
| ZGC / Shenandoah | 지연시간 수 밀리초 수준, 대용량 Heap | 초지연(low-latency) 시스템 |
✅ 4. GC의 메모리 영역
JVM의 Heap은 다음과 같이 구분됨:
🔸 Young Generation
- 새로 생성된 객체가 위치
- Eden, Survivor(S0/S1) 영역으로 구성
- Minor GC가 자주 발생
🔸 Old Generation
- 오래 살아남은 객체
- 메모리 누수의 주요 원인
- Major GC 또는 Full GC 대상
✅ 5. 실무에서 중요한 GC 튜닝 포인트
항목설명
| -Xms, -Xmx | Heap 최소/최대 크기 설정 |
| -Xss | 스레드 Stack 크기 (스레드 수에 영향) |
| -XX:+UseG1GC | G1 GC 사용 여부 |
| -XX:+PrintGCDetails | GC 상세 로그 출력 |
| GC 로그 분석 도구 | GCViewer, GCEasy, VisualVM 등 |
✅ 6. GC가 성능에 미치는 영향
영향설명
| Stop-The-World(STW) | GC 중 모든 애플리케이션 스레드 일시 중단 (지연 발생 원인) |
| GC Pause Time | 요청이 밀리거나 응답이 늦어지는 원인 |
| Full GC | 응답이 수 초 지연될 수 있어 실무에서는 경계 대상 |
| 과도한 객체 생성 | GC 부담 증가 → CPU 상승, GC 빈도 증가 |
✅ 7. 실무 대응 예시
증상원인대응
| 응답이 수 초간 정지됨 | Full GC | 객체 수명 관리, G1GC 전환, Heap 증설 |
| GC 로그 없이 OOM 발생 | GC 미수행 + 메모리 누수 | 힙덤프 분석, 참조 해제 여부 확인 |
| CPU 100% 고정 | Minor GC 반복 | 객체 재사용, 힙/GC 전략 변경 |
✅ 8. GC 튜닝 전략 요약
전략설명
| GC 알고리즘 변경 | G1GC, ZGC 등으로 전환하여 지연 최소화 |
| 객체 생명 주기 관리 | 불필요한 객체 생성을 피하고, Pool 사용 권장 |
| GC 로그 기반 분석 | GC 발생 시간, 멈춤 시간 추적 후 조정 |
| 힙 사이즈 조절 | 여유 있는 힙 설정이 GC 횟수를 줄임 |
📌 결론 요약
- GC는 Java의 자동 메모리 회수 시스템
- JVM이 참조되지 않는 객체를 제거하여 힙 공간을 확보
- 성능 이슈의 원인이 되기도 하므로 GC 알고리즘 선택과 튜닝이 중요
- Heap 사용량, 객체 수명, GC 로그 분석이 핵심 진단 도구
🧠 GC 튜닝 암기카드
💡 [카드 1] Minor GC vs Major GC
- Minor GC: Young 영역에서 발생, 빠르고 자주 일어남
- Major/Full GC: Old 영역 대상, 정지 시간 길고 성능에 큰 영향
💡 [카드 2] GC 대상
- GC는 힙(Heap) 메모리만 정리
- Stack, Metaspace는 별도 관리
💡 [카드 3] G1 GC
- Region 기반 GC 알고리즘
- Young/Old 분리 없이 동적 구성
- Full GC 없이 처리 유도, 대규모 힙에서 성능 우수
💡 [카드 4] Stop-The-World (STW)
- GC 중 모든 애플리케이션 스레드 일시 정지
- GC 튜닝 핵심은 STW 최소화
💡 [카드 5] 객체 생존 주기
- Young → Survivor → Old로 이동
- Survivor 영역을 넘기면 Old 영역으로 승격(Promotion)
💡 [카드 6] GC 튜닝 주요 옵션
옵션설명
| -Xms / -Xmx | Heap 최소/최대 크기 |
| -Xss | 스레드 Stack 크기 |
| -XX:+UseG1GC | G1 GC 활성화 |
| -XX:+PrintGCDetails | GC 상세 로그 출력 |
💡 [카드 7] Full GC 빈도 높을 때 조치
- 객체 수명 최적화
- 힙 증설 (-Xmx)
- G1GC 전환
- 대용량 객체 캐시 개선
💡 [카드 8] GC 분석 도구
- jstat, jmap, VisualVM
- GCEasy.io, GCViewer
💡 [카드 9] OutOfMemoryError (OOM) 원인
- Old 영역 포화
- Perm/Metaspace 포화
- 스레드 과다 생성 (unable to create native thread)
💡 [카드 10] GC와 TPS 관계
- GC 빈도/지연 증가 → TPS 하락
- 대기열 증가, 응답지연, 타임아웃 발생 가능
💡 [카드 11] GC 로그에 나타나는 키워드
키워드의미
| GC | Minor GC |
| Full GC | Major GC |
| Pause | STW 시간 |
| eden, survivor, old | 각 힙 영역 사용량 표시 |
💡 [카드 12] GC 튜닝 전략 요약
- G1GC 사용 고려
- 객체 재사용, 캐시 최적화
- 힙 크기 조정 (Xmx, Xms)
- 로그 기반 분석 → OOM/FullGC 원인 파악
- STW 시간 줄이기: GC 알고리즘 전환, GC Pause 타이밍 확인