GC(Garbage Collection)는 Java 및 기타 고급 언어에서 더 이상 사용되지 않는 객체를 자동으로 메모리에서 정리해주는 기능입니다.
즉, 프로그래머가 직접 free() 같은 메모리 해제를 하지 않아도 되게 만들어주는 자동 메모리 관리 시스템입니다.

아래는 실무, 성능, TA 관점까지 반영하여 설명드립니다.


✅ 1. GC란? (기본 개념)

구분설명
목적 사용되지 않는 객체를 정리해 힙(Heap) 메모리 누수 방지
타이밍 JVM이 메모리 부족 또는 일정 조건에서 자동 수행
대상 더 이상 참조되지 않는 객체(=Unreachable Object)
관리 영역 주로 Heap 메모리 영역을 대상으로 함

✅ 2. GC의 주요 동작 과정

  1. 객체 생성
    • new 연산자 등을 통해 Heap에 객체 생성됨
  2. 객체 참조 확인
    • JVM은 "어떤 객체가 여전히 쓰이는가?"를 **루트(Root Set)**에서 따라가며 확인
    • 참조되지 않는 객체는 Garbage로 간주
  3. GC 수행
    • 참조되지 않는 객체를 정리하여 Heap 공간 회수
  4. 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 튜닝 전략 요약

  1. G1GC 사용 고려
  2. 객체 재사용, 캐시 최적화
  3. 힙 크기 조정 (Xmx, Xms)
  4. 로그 기반 분석 → OOM/FullGC 원인 파악
  5. STW 시간 줄이기: GC 알고리즘 전환, GC Pause 타이밍 확인

+ Recent posts