일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 비동기
- $p.local
- .md
- java 21
- garbage collection
- SMTP
- 명령
- markdown
- project loom
- controlleradvice
- 캐시
- virtual threads
- mail server
- java
- SP4
- 웹스퀘어
- GIT
- github
- 쿠키
- Spring
- gc튜닝
- AWS Game Day
- WebSquare5
- gameday
- ExceptionHandler
- $p.data
- CPU 바운드
- gc
- 세션
- $p
- Today
- Total
왔구나, 쉬다 가
Java 애플리케이션 성능을 향상시키는 GC 튜닝 실전 가이드 본문
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 튜닝을 적용하는 실전 예제를 다뤄보겠다. 🚀