::: tip
해당 포스팅은 MAT 사용법에 초첨을 맞춰 보시면 됩니다. :D
:::
최근 메모리 사용률이 80%를 넘은 상황이 여러 번 발생하였습니다. 80% 넘었을 때마다 서버를 재기동하여 OOM (Out Of Memory)이 발생하지는 않았지만, 반복되는 것으로 보아 어디선가 메모리 누수가 나고 있는 것으로 보여 Heap Dump를 분석하기로 결정했습니다.
먼저, Podman 컨테이너 내에서 실행 중인 Java 프로세스의 PID를 알아냅니다.
podman top <container_name>
# e.g.
podman top container-name
그 다음 Heap Dump를 생성하기 위한 도구인 jmap
을 사용해 아래와 같이 명령어를 입력합니다.
podman exec <container_name> jmap -dump:format=b,file=<dump_file_path> <pid>
# e.g.
podman exec container-name jmap -dump:format=b,file=file-name.heapdump.hprof 1
container_name
: 위에서 사용한 Java 프로세스를 실행 중인 Podman 컨테이너 이름dump_file_path
: Podman 컨테이너 내에 dump 파일을 생성할 경로 및 이름. 이 때, 이름 끝이.hprof
확장자를 붙일 것pid
: 이전 명령을 통해 알아낸 PID 값
Heap Dump가 생성되면 아래 명령어를 통해 로컬로 가져올 수 있습니다. 만약, 이미 로컬에 생성되어 있다면 해당 부분은 생략해도 됩니다.
podman cp <container_name>:<container_file_path> <host_file_path>
# e.g.
podman cp container-name:/apps/file-name.heapdump.hprof ./
container_name
: Java 프로세스를 실행 중인 Podman 컨테이너 이름container_file_path
: Heap Dump 경로와 이름host_file_path
에 다운 받길 원하는 로컬 경로 (이름 X) 명령어를 실행하면 Heap Dump가.hprof
라는 확장자로 생성된 것을 확인할 수 있습니다.
.hprof
파일 분석을 위해 eclipse 홈페이지에서 MAT을 설치합니다.
윈도우 환경이어서 Windows (x86_64)
파일을 설치했으며, 설치 버전은 1.14.0 입니다.
설치 완료 후 실행하면 다음과 같은 화면을 볼 수 있습니다.
여러 메뉴 중 Open a Heap Dump
를 클릭하고, .hprof
파일을 열어줍니다.
그러면 다음과 같은 Getting Started Wizard
화면이 뜨는데, 기본 설정을 그대로 유지한 채 Finish
를 누릅니다.
그러면 다음과 같이 메모리 누수가 어디서 발생했는지에 대한 내용을 보여줍니다.
전체 내용을 분석해보면 Buffer에서 메모리 누수가 발생하고 있으며, 77.5MB로 매우 작은 양의 메모리가 누수되고 있음을 확인할 수 있습니다. 메모리가 증가하는 주요 원인은 메모리 누수가 아님을 알게 되었으며 다른 곳에서 원인을 찾아보기로 결정하였습니다.
참고