JAVA APP에서 Heap Size를
보통 JAVA Application 을 실행할때 아래와 같이 Heap Size를 설정하는것이 일반적이다.
# Java -Xms 512m -Xmx 1024m app.jar |
-Xms : 최소 Heap Size
-Xmx : 최대 Heap Size
그러나, 컨테이너의 환경이라면, Resource 의 CPU / MEM을 필요시마다 변경이 필요하므로,
Xms / Xmx 와 같이 Heap Size를 '고정'하는 건, 직관적으로 고려하기 어렵다.
(왜냐하면, 컨테이너 관리자 입장에서는 메모리가 부족하다고 해서 메모리를 늘려주었는데,
왜 실제로 사용하는 메모리는 늘어나지 않는가? 하는 이슈를 얻을 수 있기 때문이다. )
따라서, 컨테이너 환경에서 JAVA Application 으로 서비스를 한다면,
컨테이너 환경에 더 맞도록 JAVA의 Heap memory 사이즈도 비율적으로 설정하는 편이 더 맞다. Or 추천한다.
(예를 들어, JAVA Heap Memory Size는 컨테이너 resource limit의 50%를 넘지 않도록 한다 등..)
비율로 설정하는 방법은 아래와 같은 옵션으로 제공한다.
-XX:MaxRAMPercentage, -XX:MinRAMPercentage
(두 옵션은 모두 OpenJDK8 u191 이상에서만 지원된다. )
(추가로, -Xms 와 같이 JVM 인수가 설정되면 이 옵션들은 무시 된다. )
설명 : -XX:MaxRAMPercentage=50.0 인경우, 컨테이너 Memory limit이 1GB일때, HEAP Memory Size는 512GB 가 된다.
만약 컨테이너 환경에서 Heap Memory Size를 설정하지 않았다면,
HEAP Memory Size는 컨테이너 resource limit Memory의 25%가 Default 값이다.
MaxRAMPercentage 예시
실제 메모리 사용량 확인
Limit 3G의 60%인 1.8까지 사용함을 확인.
※ MaxRAMPercentage의 값은 얼마로 해야 적정한가?
: JAVA에서는 Heap 영역외에 non-Heap 영역(ex. GC, Code, …)도 있기 때문에,
: 대략 Heap 영역은 최대 70%를 넘지 않기를 권고한다.
※ jAVA_OPTS 와 _JAVA_OPTIONS의 차이?
: JAVA_OPTS는 Java 실행시, 자체적으로 인식하는 환경변수가 아닙니다. 매개변수로 활용
: 대신, 많은 스크립트에서 Java App 을 실행할때 wrapping 해서 사용하는 변수명으로 JAVA_OPTS 를 많이 사용합니다.
: _JAVA_OPTIONS는 Java 실행시 매개변수로 사용하는 방법 대신, 환경변수로 적용하는 방안입니다.
(환경변수로 적용하는 방안 : JAVA_TOOL_OPTIONS, _JAVA_OPTIONS가 있음)
그러나, _JAVA_OPTIONS는 언제 지원중단될지 알 수 없는 환경변수입니다.
따라서, 사용하고자 한다면 "JAVA_TOOL_OPTIONS"은 사용하는것이 좋습니다.
(밑줄 이름은 비공개로, 표준화하고 싶지 않은 양식이라는것이 향후 뱡향입니다. )
"_JAVA_OPTIONS" 는 Oracle에서 사용하는 방법
"IBM_JAVA_OPTIONS" 는 IBM JVM에서 사용 하는 방법
"JAVA_TOOL_OPTIONS" 는 모든 VM에서 인식됨.
※ MaxRAMPercentage 값을 정수? 소수?
:
컨테이너 JVM Heap Memory 정보 참고
https://www.baeldung.com/ops/docker-jvm-heap-size
https://www.baeldung.com/java-jvm-parameters-rampercentage
JAVA_OPTS vs JAVA_OPTIONS 정보 참고
'IT Knowledge > Kubernetes' 카테고리의 다른 글
How to Kubernetes IPv6 Disable(OnPrem) (0) | 2025.03.24 |
---|---|
Kubernetes HostAliases로 Pod에 /etc/hosts 항목 추가하기 (0) | 2025.03.24 |
Kubernetes Cluster Version Upgrade(kubeadm) (0) | 2025.03.21 |
Kubernetes Garbage Collection(용량정리) (0) | 2025.03.20 |
Kubernetes API서버 인증서에 SANs 추가 (0) | 2024.07.08 |
댓글