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는 관측 범위가 달라 힙만 보면 사각지대가 생기므로 네이티브 자원 추적을 병행해야 함
