본문 바로가기
삵

컨테이너 메모리를 2Gi 줬는데 자바 힙이 512M까지만 늘어납니다

조회 0 · 댓글 0
케케이시88작성자2026년 10월 15일

지난번에 내부 ALB 504로 질문 올렸던 그 서비스입니다. 이번엔 다른 증상인데, EKS에 올린 스프링부트 앱(Spring Boot 3.2, Temurin JDK 17, 리눅스 컨테이너)에서 특정 배치가 돌 때 java.lang.OutOfMemoryError: Java heap space가 납니다.

이상한 건 파드 메모리 limit은 2Gi로 넉넉히 줬고, 터지는 순간에도 파드 실측 사용량(container_memory_working_set_bytes)은 700MB 안팎밖에 안 됩니다. 즉 컨테이너 한도는 아직 한참 남았는데 힙만 먼저 터집니다. Dockerfile에서 -Xmx를 따로 안 주고 JAVA_OPTS도 비워둔 상태로 java -jar app.jar로 띄웁니다.

resources:
  limits:
    memory: 2Gi
  requests:
    memory: 1Gi

컨테이너 안에서 실제 힙 상한을 찍어보니 512MB 근처로 잡혀 있습니다.

$ jcmd 1 VM.flags | tr ' ' '\n' | grep -i -E 'MaxHeapSize|MaxRAMPercentage|UseContainerSupport'
-XX:MaxHeapSize=536870912
-XX:MaxRAMPercentage=25.000000
-XX:+UseContainerSupport

$ cat /sys/fs/cgroup/memory.max
2147483648

cgroup 한도는 2Gi로 제대로 읽히는데 왜 힙은 그 1/4인 512M에서 멈추는지 이해가 안 됩니다. limit을 4Gi로 올려봐도 힙 상한이 비례해서 1G쯤으로만 바뀔 뿐 여전히 전체를 못 씁니다. 컨테이너 메모리는 남아도는데 힙만 작게 잡히는 이 동작이 정상인지, 맞다면 어디서 결정되는 값인지 궁금합니다.

로그인 후 답글을 남길 수 있습니다.