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

0
AI 요약

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

이 게시물은 JVM 힙은 정상인데도 Docker 컨테이너에서 RSS가 증가해 OOM Killed되는 사례를 네이티브 메모리 관점에서 추적하는 방법을 다룹니다.

문제 원인

  • NMT로는 추적되지 않는 네이티브 malloc 영역이 존재하고, NMT 합계와 실제 RSS 사이에 갭이 발생함을 설명
  • getResourceAsStream으로 읽은 DEFLATE(압축) 리소스 처리 과정에서 java.util.zip.Inflater의 네이티브 버퍼가 닫히지 않아 누적됨

추적 워크플로우

  • jemalloc+jeprof로 네이티브 할당 콜그래프를 확인해 zlib/Inflater 경로를 특정
  • async-profiler -e alloc로 자바 힙 할당 스택을 함께 확인해 InflaterInputStream/Inflater 생성으로 이어지는 자바 코드 경로를 연결

처방 및 결론

  • 스트림을 close()/try-with-resources로 확실히 닫는 것이 근본 해결책이며 RSS가 크게 감소함
  • 코드를 즉시 고치기 어렵다면 jemalloc arena 설정이나 glibc MALLOC_ARENA_MAX 등 할당기/튜닝을 워크로드에 맞춰 측정·적용
  • 힙·NMT·RSS는 관측 범위가 달라 힙만 보면 사각지대가 생기므로 네이티브 자원 추적을 병행해야 함

연관 게시글