왔구나, 쉬다 가

Java 애플리케이션 성능을 향상시키는 GC 튜닝 실전 가이드 본문

Language/Java

Java 애플리케이션 성능을 향상시키는 GC 튜닝 실전 가이드

예스맨 2025. 2. 24. 06:15

1. GC(가비지 컬렉션)란?

Java에서는 메모리 관리를 위해 GC(Garbage Collection)이 자동으로 수행된다.
그러나 잘못된 GC 설정은 애플리케이션의 성능을 저하시킬 수 있다.
GC가 실행될 때 애플리케이션이 멈추는 Stop-the-World(STW) 문제를 최소화하는 것이 핵심이다.


2. 주요 GC 종류와 비교

GC 타입특징적합한 환경

Serial GC 단일 스레드, 작은 힙 크기용 작은 애플리케이션, 모바일
Parallel GC 여러 스레드로 GC 수행 CPU 성능이 중요한 경우
G1 GC (기본 GC) 낮은 STW, 예측 가능 대부분의 서버 애플리케이션
ZGC 초저지연, 큰 힙 크기 지원 대규모 데이터 처리 (TB 단위)
Shenandoah 낮은 지연시간 빠른 응답 속도가 중요한 경우

3. GC 로그 활성화 및 분석 방법

GC 튜닝을 하려면 먼저 로그를 확인해야 한다.
JVM 옵션을 추가하면 GC 로그를 남길 수 있다.

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log​
 

💡 예제 로그

[2024-02-21T12:00:01.123+0000] GC (Allocation Failure) 512M->128M(2G)
  • Allocation Failure: 힙 메모리가 부족해서 GC가 실행됨
  • 512M->128M(2G): GC 후 메모리가 줄어듦 (GC 전 512MB → GC 후 128MB, 전체 힙 2GB)

4. G1GC 튜닝 실전 적용

G1GC는 대부분의 Spring Boot 애플리케이션에 적합한 GC다.
하지만 기본 설정으로는 최적의 성능을 보장하지 않기 때문에 튜닝이 필요하다.

 

💡 JVM 옵션 추천

-XX:+UseG1GC 
-XX:MaxGCPauseMillis=200 
-XX:InitiatingHeapOccupancyPercent=45 
-XX:+ParallelRefProcEnabled 
-XX:+UseStringDeduplication

🔹 MaxGCPauseMillis=200: GC로 인한 중단 시간을 200ms 이하로 유지
🔹 InitiatingHeapOccupancyPercent=45: 힙 사용량이 45% 이상 되면 GC 수행
🔹 UseStringDeduplication: 같은 문자열 객체를 하나로 합쳐 메모리 절약


5. 실무에서 GC 튜닝 적용 사례

📌 사례 1: 배치 작업 중 Full GC 발생
🔍 문제: 하루 500만 건의 데이터를 처리하는 배치 프로그램에서 Full GC가 자주 발생
✅ 해결:

  • G1GC로 전환 (-XX:+UseG1GC)
  • -XX:MaxGCPauseMillis=500 설정하여 GC 중단 시간을 조정
  • -Xms2G -Xmx4G 로 힙 크기 조정하여 Full GC 빈도 감소

📌 사례 2: 웹 애플리케이션에서 지연 시간 증가
🔍 문제: 대규모 트래픽에서 응답 시간이 급격히 증가
✅ 해결:

  • Shenandoah GC로 전환 (-XX:+UseShenandoahGC)
  • -XX:ShenandoahGCHeuristics=adaptive 로 자동 최적화 활성화
  • GC 로그 분석 후 -XX:InitiatingHeapOccupancyPercent=40 조정하여 성능 개선

💡 마무리

GC 튜닝은 JVM의 메모리 특성을 이해하고, 애플리케이션의 요구 사항에 맞게 조정하는 과정이다.
시니어 개발자로서 GC 로그를 분석하고 튜닝하는 능력은 필수적인 스킬이다.

👉 다음 글에서는 Spring Boot 애플리케이션에서 GC 튜닝을 적용하는 실전 예제를 다뤄보겠다. 🚀