컨테이너에서 JVM 힙은 -Xmx 대신 -XX:MaxRAMPercentage로 잡기
조회 3 · 댓글 0
Docker나 쿠버네티스에서 자바 힙을 -Xmx로 박아두면 컨테이너 메모리 리밋을 바꿀 때마다 값을 같이 고쳐야 합니다. JDK 10 이상(8u191 백포트)은 -XX:+UseContainerSupport가 기본 true라, JVM이 리눅스 cgroup에 걸린 메모리 리밋을 직접 읽어 힙을 잡습니다. 그래서 절대값 대신 리밋 대비 비율인 -XX:MaxRAMPercentage로 주면 리밋만 바꿔도 힙이 따라옵니다.
# 컨테이너 리밋 1g, 힙을 그 75%로
docker run --memory=1g myapp \
java -XX:MaxRAMPercentage=75.0 -jar app.jar여기서 함정은 기본값입니다. MaxRAMPercentage 기본은 25라, 컨테이너를 자바 프로세스 하나가 통째로 쓰는데도 리밋의 4분의 1만 힙으로 잡힙니다. 대개 낮으니 환경에 맞게 올려잡습니다. 참고로 InitialRAMPercentage 기본은 1.5625, MinRAMPercentage 기본은 50입니다.
주의로, -Xmx나 -Xms를 명시하면 해당 퍼센트 옵션은 무시됩니다. 둘을 섞지 말고 하나만 쓰세요. 계산된 힙과 컨테이너 감지가 맞는지는 아래로 확인합니다.
# 최종 MaxHeapSize 확인
java -XX:MaxRAMPercentage=75.0 -XX:+PrintFlagsFinal -version | grep -i maxheapsize
# cgroup 감지 로그 보기 (리눅스 전용)
java -Xlog:os+container=trace -version🔗 https://docs.oracle.com/en/java/javase/21/docs/specs/man/java.html
🔗 https://developers.redhat.com/articles/2022/04/19/java-17-whats-new-openjdks-container-awareness
로그인 후 답글을 남길 수 있습니다.