JVM heap은 멀쩡한데 왜 메모리가 터질까? — Docker 환경 네이티브 메모리 삽질기 (Part 1)

0
AI 요약

이 글은 AI가 원문을 분석하여 핵심 내용을 요약한 것입니다.

이 게시물은 JVM 힙은 정상인데 Docker 환경에서 메모리가 계속 증가해 OOM Killer로 프로세스가 강제 종료되는 문제를 다룹니다. 서버 메모리 사용량은 트래픽과 무관하게 시간이 지남에 따라 우상향했고, 힙 덤프·GC 로그에서는 이상 징후를 찾지 못함니다. Docker의 cgroup은 힙(-Xmx)만이 아니라 RSS처럼 프로세스가 점유한 전체 물리 메모리를 기준으로 제한을 판단해, JVM이 모르는 네이티브 메모리 증가가 곧 OOM으로 이어짐을 설명합니다. JVM 메모리는 힙과 네이티브 메모리로 나뉘며, Metaspace·Thread Stack·Code Cache·Direct ByteBuffer 등 다양한 네이티브 구성 요소가 늘어날 수 있음을 정리합니다. NMT(Native Memory Tracking)를 detail로 활성화해 네이티브 사용을 추적했지만, JVM 외부 네이티브 라이브러리의 malloc 같은 경로는 NMT가 추적하지 못하는 한계가 있음을 확인합니다. 그 결과 NMT committed는 약 9GB로 보이는데 top RES는 약 14GB로 관측되어 약 5GB의 미스터리가 남았다고 결론내림니다.

연관 게시글