스택큐힙리스트

JVM GC 종류 완전 정리 + 실전 튜닝 가이드 본문

개발

JVM GC 종류 완전 정리 + 실전 튜닝 가이드

스택큐힙리스트 2025. 7. 11. 13:42
반응형

Java 애플리케이션이 점점 커지다 보면 성능 병목의 핵심 원인 중 하나가 GC(Garbage Collection)이라는 걸 알게 됩니다. GC가 뭔지, 어떤 종류가 있는지, 그리고 어떻게 튜닝해야 서버가 멈추지 않고 안정적으로 돌아갈 수 있는지 고민되시죠?

이번 포스팅에서는 JVM의 주요 GC 종류를 비교하고, 실무에서 바로 써먹을 수 있는 GC 튜닝 방법까지 한 번에 정리해드립니다.


✅ 1. GC(Garbage Collection)란?

GC는 더 이상 사용되지 않는 객체를 힙 메모리에서 제거하는 작업입니다. 메모리 누수를 방지하고, 애플리케이션이 장시간 안정적으로 동작할 수 있도록 도와주는 핵심 기능이죠.

하지만 GC는 공짜가 아닙니다. 실행되는 동안 애플리케이션의 모든 스레드가 일시정지되는 Stop-the-World(STW) 현상이 발생할 수 있습니다. 이 시간을 최소화하는 것이 GC 튜닝의 핵심입니다.


✅ 2. 주요 GC 종류 비교

🔹 ① Serial GC (-XX:+UseSerialGC)

  • 싱글 스레드 기반
  • 단순하지만 느림
  • STW 시간 김
  • 클라이언트 애플리케이션이나 리소스가 매우 적은 환경에 적합

🔹 ② Parallel GC (-XX:+UseParallelGC)

  • 멀티 스레드로 GC 수행
  • Throughput(처리량) 중심
  • 기본 GC (Java 8 기준)
  • STW는 존재하지만 상대적으로 빠름
  • 서버 애플리케이션에 많이 사용됨

🔹 ③ CMS GC (-XX:+UseConcMarkSweepGC)

  • STW 시간을 줄이기 위해 동시 마크/스윕 수행
  • 대부분 백그라운드에서 실행
  • 단점: 프래그멘테이션 발생 가능
  • Java 9부터 Deprecated → Java 14에서 완전 제거

🔹 ④ G1 GC (-XX:+UseG1GC)

  • Java 9 이후의 기본 GC
  • Region 단위로 메모리 분할
  • GC 시간이 예측 가능하고 짧음
  • Full GC도 STW지만 상대적으로 효율적
  • 실무에서 가장 많이 쓰이는 GC

🔹 ⑤ ZGC (-XX:+UseZGC) / Shenandoah

  • 초저지연(ultra low pause) GC
  • 대부분 작업을 애플리케이션과 동시 수행
  • STW는 몇 밀리초 수준
  • Java 11~17 이상에서 사용 가능
  • 대용량 처리 시스템, 실시간 서비스에 적합

✅ 3. 실전 GC 튜닝 가이드

GC 튜닝은 "서버 사양"과 "애플리케이션의 성격"에 따라 다르지만, 기본적으로 아래 순서로 접근하면 됩니다.


🔹 ① JVM 힙 크기 설정

-Xms2G -Xmx2G
  • -Xms: 초기 힙 사이즈
  • -Xmx: 최대 힙 사이즈
  • 두 값을 같게 설정하면 메모리 확장/축소로 인한 부하를 줄일 수 있음

🔹 ② GC 종류 선택

-XX:+UseG1GC
  • G1GC를 기본으로 사용하고, 고성능이 필요하면 ZGC, Shenandoah 고려

🔹 ③ GC 로그 설정 (필수!)

-Xlog:gc*:file=gc.log:time,uptime,level,tags
  • GC 로그는 분석 도구(GCEasy, GCViewer 등)와 함께 사용
  • Full GC 빈도와 STW 시간을 파악 가능

🔹 ④ G1GC 튜닝 예시

-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=45
  • 목표 GC 중단 시간 설정
  • 힙의 몇 % 찼을 때 GC 시작할지 지정

🔹 ⑤ 실무 팁

  • GC 튜닝보다 먼저 불필요한 객체 생성을 줄이는 코드 리팩토링이 우선
  • 서버 재기동 없이 GC 튜닝을 적용하려면 Docker나 Kubernetes 환경에서 JVM 옵션 관리에 유의
  • JVisualVM, JFR, jstat, jmap 등을 활용한 힙 상태 분석도 병행 추천

✅ 4. 언제 어떤 GC를 써야 할까?


 

상황 추천 GC
리소스 적은 시스템 SerialGC
고성능 일반 서버 G1GC
초고속 실시간 응답 필요 ZGC 또는 Shenandoah
Java 8 기반 레거시 시스템 ParallelGC 또는 CMS (단 CMS는 비추천)
 

 

반응형
Comments