들어가며
Spring Boot는 편리한 설정과 빠른 개발 속도로 널리 사용되지만, JVM 옵션을 기본값 그대로 사용하는 경우 실제 서비스 환경에서 성능 병목이 발생할 수 있습니다.
특히 메모리 사용량, GC 동작 방식, 스레드 수 제한, 리소스 오버헤드 등의 문제는 JVM 설정을 통해 조절할 수 있으며, 애플리케이션의 응답 속도, 안정성, 확장성에 직결됩니다.
이 글에서는 Spring Boot 기반 애플리케이션을 대상으로 JVM 최적화 설정의 기본 원리, 실전 적용 예시, 추천 옵션 템플릿을 단계별로 정리합니다.
1. 왜 JVM 설정이 중요한가?
- Spring Boot는 기본적으로 Fat Jar 구조로 실행 → JVM 위에서 독립 실행
- 설정하지 않으면 JVM은 시스템 자원의 일부만 사용하며, GC 설정도 보통 기본값(G1GC, ParallelGC) 사용
- 실무에서는 메모리 부족, GC 지연, OOM, 스레드 과다 생성 등의 문제가 JVM 튜닝으로 해결됨
2. 자주 사용하는 JVM 옵션
기본 구성 예시:
java \
-Xms512m -Xmx512m \ # 힙 메모리 설정
-XX:+UseG1GC \ # GC 방식 설정
-XX:MaxGCPauseMillis=100 \ # G1GC 지연 시간 목표
-XX:+HeapDumpOnOutOfMemoryError \ # OOM 시 덤프 저장
-XX:HeapDumpPath=./heapdump.hprof \ # 덤프 위치 지정
-Xlog:gc*:file=./gc.log:time,uptime,level,tags \ # GC 로그
-jar my-spring-app.jar
설명 요약
옵션 | 설명 |
-Xms, -Xmx | Heap 메모리 초기/최대 크기 설정 |
-XX:+UseG1GC | G1GC는 Spring Boot에 기본 적합한 GC 방식 |
-XX:MaxGCPauseMillis | 지연 시간 기준 목표 (G1GC용) |
-Xlog:gc* | GC 로그 수집 (JDK 9 이상) |
-XX:+HeapDumpOnOutOfMemoryError | OOM 발생 시 메모리 덤프 생성 |
3. 실전 JVM 튜닝 포인트
1️⃣ 메모리 설정 (Heap, Metaspace)
-Xms1024m -Xmx1024m # 작은 환경: 512~1024m 권장
-XX:MaxMetaspaceSize=256m # 클래스 메타 영역 제한
JVM은 힙 외에도 Metaspace, Stack, CodeCache 등 다양한 공간을 사용하므로 전체 서버 메모리 고려 필요
2️⃣ GC 튜닝
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=30
G1GC는 대부분의 Spring Boot 앱에 적합. ZGC는 초대형/지연 민감 서비스에서만 고려
3️⃣ 쓰레드 수 제한
-XX:ParallelGCThreads=4
-XX:ConcGCThreads=2
GC 관련 스레드가 과다 생성되면 CPU 병목 발생 가능 → 실제 CPU 코어 수에 맞춰 설정
4. Spring Boot 실행 스크립트에 반영하기
application.sh 예시
#!/bin/bash
JAVA_OPTS="-Xms1024m -Xmx1024m \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=100 \
-Xlog:gc*:file=./logs/gc.log:time,level,tags"
java $JAVA_OPTS -jar my-spring-app.jar
빌드/배포 자동화 도구(Jenkins, Docker 등)와 연계 시 JAVA_OPTS만 바꿔도 환경별 조정 가능
5. 실전 점검 팁
- 메모리 사용량 확인: jstat -gc <PID>, VisualVM, JMX, Prometheus exporter
- GC 로그 분석: gc.log → GCViewer, GCEasy.io 등 도구 사용
- OOM 방지: 반드시 HeapDumpOnOutOfMemoryError 설정할 것
- Container 환경일 경우: -XX:+UseContainerSupport (JDK 10+ 자동 적용)
마치며
Spring Boot는 JVM 위에서 실행되는 구조이기 때문에, JVM 설정을 잘 다루는 것이 곧 운영 안정성과 성능 최적화의 핵심입니다.
JVM 옵션은 처음에는 복잡하게 느껴지지만, 기본 메모리 조정 + GC 정책 + 로그 수집만 설정해도 큰 효과를 볼 수 있습니다.
📂 platform/java 카테고리에서는 다음 주제로:
- GC 로그 실시간 분석 도구 사용법
- Spring Boot + Docker 환경의 JVM 튜닝
- OOM 예외 상황에서 Heap Dump 분석하기
를 이어서 다룹니다.
📌 이전 글 다시보기
👉 GC의 종류와 튜닝 전략 (G1GC, ZGC, ParallelGC)
📌 다음 글 미리보기
👉 java -jar 실행 시 환경 변수 구성법
📚 Java_runtime 시리즈 전체 보기
👉 https://jobreview.tistory.com/category/platform_infra_cloud/java_runtime
'platform_infra_cloud > java_runtime' 카테고리의 다른 글
Java 애플리케이션 로그 분석 흐름 가이드 (0) | 2025.04.19 |
---|---|
java -jar 실행 시 환경 변수 구성법 가이드 (0) | 2025.04.19 |
GC의 종류와 튜닝 전략 (G1GC, ZGC, ParallelGC) (0) | 2025.04.19 |
JVM 메모리 구조 상세 분석 – Heap, Stack, Metaspace의 동작 원리 (0) | 2025.04.19 |
자바 플랫폼이란? – JVM, JDK, JRE로 이해하는 실행 환경의 구조 | Java 플랫폼의 구조와 실행 흐름 (0) | 2025.04.09 |
댓글