Java 애플리케이션에서 성능 문제의 많은 부분은 GC(Garbage Collection) 동작과 밀접한 관련이 있다. GC 로그를 통해 메모리 사용 상태를 파악하고, 튜닝 전략을 세워 시스템 안정성과 응답성을 높일 수 있다.


1. GC 로그 수집 설정

JVM 실행 시 다음 옵션을 통해 GC 로그를 수집할 수 있다:

-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/var/log/gc.log

JDK 9 이상에서는 Unified Logging을 사용:

-Xlog:gc*:file=gc.log:tags,uptime,time,level

2. GC 로그 예시와 해석 (G1GC 기준)

2024-05-10T12:00:01.123+0000: 2.345: [GC pause (G1 Evacuation Pause) (young), 0.0456789 secs]
   [Parallel Time: 42.3 ms, GC Workers: 4]
   [Eden: 256M(256M)->0B(128M) Survivors: 32M->64M Heap: 1024M(2048M)->800M(2048M)]

주요 해석 포인트:

  • GC 종류: Young GC (G1 Evacuation Pause)
  • Pause Time: 0.045초 → GC로 인한 멈춤 시간
  • Heap Before/After: 1024MB → 800MB (224MB 회수)

경고 신호:

  • Full GC, to-space exhausted, Allocation Failure: 메모리 부족 가능성
  • Pause Time이 1초 이상이면 사용자 체감 가능 → 튜닝 필요

3. GC 튜닝 전략

튜닝은 애플리케이션 특성과 사용 환경에 따라 다르며, 아래는 일반적인 방향성이다.

A. Heap 사이즈 조정

-Xms2g -Xmx4g  # 초기값과 최대값 설정
  • 너무 작으면 GC 반복 발생
  • 너무 크면 Full GC 시 오히려 문제

B. G1GC 튜닝 옵션 예시

-XX:+UseG1GC
-XX:MaxGCPauseMillis=200         # 최대 멈춤 시간 설정 (ms)
-XX:InitiatingHeapOccupancyPercent=45  # Old GC 발생 기준

C. Throughput/Latency 목표에 따른 선택

목적 전략
최대 처리량 ParallelGC, 큰 Heap, 낮은 Pause 예외 허용
짧은 응답 시간 G1GC, ZGC, Heap 최소화, MaxGCPauseMillis 조절

4. 분석 도구 추천

  • GCViewer: 시각화 기반 GC 로그 해석
  • GCEasy.io: 웹 기반 분석 자동화 도구
  • JClarity Censum: 상용 도구, 히트맵 분석 제공

+ Recent posts