Java JVM 옵션 기초(-Xms, -Xmx 등) 완벽 이해하기
Java 서버를 실행하다 보면 반드시 보게 되는 것이 바로:
-Xms
-Xmx
-XX:+UseG1GC
같은 JVM 옵션입니다.
특히 실무에서는:
- Spring Boot 서버 운영
- Kubernetes 메모리 제한
- GC 튜닝
- OOM 대응
- 성능 최적화
까지 JVM 옵션이 매우 중요합니다.
초보 시절에는 보통:
메모리 옵션 정도?
로만 이해하기 쉽습니다.
하지만 실제로는 JVM 옵션 하나로:
- GC 동작 방식
- Heap 크기
- Stop-The-World 시간
- 서버 응답속도
- OOM 발생 여부
까지 크게 달라질 수 있습니다.
이번 글에서는:
- -Xms / -Xmx
- Heap 관련 옵션
- GC 옵션
- Metaspace 옵션
- GC 로그 옵션
- 실무 서버 설정
까지 운영 관점으로 깊게 정리해보겠습니다.
1. JVM 옵션이란?
JVM 옵션은:
JVM 실행 동작을 제어하는 설정값
입니다.
즉:
메모리
GC
JIT
로그
스레드
등을 제어 가능.
2. JVM 옵션 실행 예시
대표 실행:
java -Xms1g -Xmx2g -jar app.jar
설명:
| 옵션 | 의미 |
| java | JVM 실행 |
| -Xms1g | 초기 Heap 1GB |
| -Xmx2g | 최대 Heap 2GB |
| -jar | jar 실행 옵션 |
| app.jar | 실행 파일 |
3. JVM 옵션 종류
크게:
| 종류 | 설명 |
| Standard 옵션 | 기본 JVM 옵션 |
| -X 옵션 | 비표준 확장 옵션 |
| -XX 옵션 | 고급 튜닝 옵션 |
4. 가장 중요한 옵션: -Xms
-Xms
는:
초기 Heap 메모리 크기
입니다.
5. 예시
-Xms512m
의미:
JVM 시작 시 Heap 512MB 확보
6. -Xmx란?
-Xmx
는:
최대 Heap 메모리 크기
입니다.
7. 예시
-Xmx2g
의미:
Heap 최대 2GB까지 사용 가능
8. 왜 중요할까?
Heap 부족 시:
OutOfMemoryError
발생 가능.
반대로 너무 크면:
GC Pause 증가
가능.
9. 실무에서 자주 하는 설정
대표 설정:
-Xms2g -Xmx2g
즉:
초기값 = 최대값
동일하게 맞춤.
10. 왜 동일하게 맞출까?
Heap 확장 과정 비용 제거 목적.
만약 다르면:
Heap 부족
↓
Heap 확장
↓
추가 비용 발생
가능.
11. Heap 너무 크게 잡으면 안 되는 이유
많은 초보자가:
Heap 크게 주면 무조건 좋다
생각.
하지만 문제:
Full GC 매우 오래 걸릴 수 있음
12. Young Generation 관련 옵션
대표 옵션:
-Xmn
13. -Xmn 의미
Young Generation 크기 지정
입니다.
14. 예시
-Xmn512m
의미:
Young 영역 512MB
15. Young 영역이 너무 작으면?
문제:
Minor GC 자주 발생
가능.
16. 반대로 너무 크면?
문제:
Old 영역 부족 가능
즉 균형 중요.
17. Metaspace 옵션
JDK8 이후 중요.
대표 옵션:
-XX:MetaspaceSize
-XX:MaxMetaspaceSize
18. Metaspace란?
클래스 메타정보 저장 영역.
즉:
- 클래스 정보
- 메서드 정보
- static 구조
저장.
19. Metaspace OOM 방지
대표 설정:
-XX:MaxMetaspaceSize=512m
20. GC 선택 옵션
매우 중요합니다.
대표:
-XX:+UseG1GC
21. 의미
G1GC 사용
입니다.
22. 다른 GC 옵션
| 옵션 | 의미 |
| UseSerialGC | Serial GC |
| UseParallelGC | Parallel GC |
| UseG1GC | G1GC |
| UseZGC | ZGC |
23. ZGC 사용 예시
-XX:+UseZGC
24. GC 로그 옵션
실무에서 매우 중요.
대표 옵션:
-Xlog:gc*
25. 의미
GC 상세 로그 출력
입니다.
26. 왜 GC 로그 중요할까?
GC 문제는:
로그 없으면 분석 거의 불가능
한 경우 많음.
27. Heap Dump 옵션
OOM 대응 핵심.
대표 옵션:
-XX:+HeapDumpOnOutOfMemoryError
28. 의미
OOM 발생 시 Heap Dump 생성
입니다.
29. Dump 저장 위치
-XX:HeapDumpPath=/dump
설명:
| 옵션 | 의미 |
| HeapDumpPath | Dump 저장 위치 |
30. JIT 관련 옵션
대표 옵션:
-XX:+PrintCompilation
의미:
JIT 컴파일 로그 출력
31. Stack 크기 옵션
대표 옵션:
-Xss
32. 의미
스레드 Stack 크기
입니다.
33. 예시
-Xss1m
의미:
Thread Stack 1MB
34. 왜 중요할까?
Thread 많으면:
Stack 메모리 총합 증가
가능.
35. Stack 너무 작으면?
문제:
StackOverflowError 가능
증가.
36. 서버 환경에서 중요한 옵션
대표 설정 예시:
java \
-Xms2g \
-Xmx2g \
-XX:+UseG1GC \
-Xlog:gc* \
-XX:+HeapDumpOnOutOfMemoryError \
-jar app.jar
37. 옵션 설명
| 옵션 | 설명 |
| -Xms2g | 초기 Heap 2GB |
| -Xmx2g | 최대 Heap 2GB |
| UseG1GC | G1GC 사용 |
| Xlog:gc* | GC 로그 출력 |
| HeapDumpOnOOM | OOM 시 Dump 생성 |
38. Kubernetes 환경 주의점
실무에서 매우 중요.
컨테이너 제한:
Container Memory Limit
보다 JVM Heap 크게 잡으면:
OOMKilled
가능.
39. 왜 위험할까?
JVM은 Heap 외에도 사용:
- Metaspace
- Thread Stack
- Direct Memory
- Native Memory
즉:
Heap = 전체 메모리 아님
40. 실무 메모리 계산 예시
예:
Container 4GB
Heap 3GB
이면 위험 가능.
Native 영역 부족 가능성 존재.
41. Direct Memory 옵션
NIO 환경 중요.
대표 옵션:
-XX:MaxDirectMemorySize
42. 언제 중요할까?
대표 사례:
- Netty
- Kafka
- Elasticsearch
같은 고성능 IO 서버.
43. JVM 옵션 확인 방법
대표 명령:
jcmd PID VM.flags
설명:
| 요소 | 의미 |
| jcmd | JVM 진단 도구 |
| PID | 프로세스 ID |
| VM.flags | JVM 옵션 조회 |
44. 실행 중 GC 확인
대표 명령:
jstat -gc PID 1000
설명:
| 요소 | 의미 |
| jstat | JVM 통계 도구 |
| -gc | GC 상태 출력 |
| PID | JVM 프로세스 |
| 1000 | 1초 간격(ms) |
45. 실무에서 자주 하는 실수
1) Heap만 크게 설정
GC Pause 폭증 가능.
2) GC 로그 안 남김
장애 분석 매우 어려움.
3) Container Memory 고려 안 함
K8s 환경에서 OOMKilled 흔함.
4) 기본값 맹신
서비스 특성 따라 튜닝 필요.
46. 가장 중요한 핵심 한 줄
JVM 옵션은
“메모리·GC·성능 전략을 결정하는 서버 운영 설정”
입니다.
47. 정리
JVM 옵션은 단순 실행 옵션이 아닙니다.
실제로는:
- Heap 크기
- GC 전략
- 서버 응답속도
- OOM 대응
- 운영 안정성
전체를 결정하는 매우 중요한 JVM 운영 설정입니다.
특히 실무에서는:
- -Xms / -Xmx
- G1GC / ZGC
- GC 로그
- Heap Dump
- Container 메모리
를 정확히 이해하는 것이 매우 중요합니다.
다음 글에서는:
List / Set / Map 차이
를 내부 구조(HashTable, Tree, HashMap), 시간복잡도, 실무 사용 기준까지 포함해서 깊게 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java ArrayList vs LinkedList 완벽 비교 (0) | 2026.05.27 |
|---|---|
| Java List / Set / Map 차이 완벽 이해하기 (0) | 2026.05.27 |
| Java Escape Analysis 완벽 이해하기 (0) | 2026.05.26 |
| Java 인터프리터(Interpreter) vs JIT Compiler 완벽 이해하기 (0) | 2026.05.26 |
| Java JIT Compiler 동작 원리 완벽 이해하기 (0) | 2026.05.26 |
댓글