Skip to content

Latest commit

 

History

History
76 lines (53 loc) · 3.72 KB

001.Analyzing_Heap_Dump_with_MAT.md

File metadata and controls

76 lines (53 loc) · 3.72 KB

001. MAT으로 Heap Dump 분석하기

::: tip

해당 포스팅은 MAT 사용법에 초첨을 맞춰 보시면 됩니다. :D

:::

최근 메모리 사용률이 80%를 넘은 상황이 여러 번 발생하였습니다. 80% 넘었을 때마다 서버를 재기동하여 OOM (Out Of Memory)이 발생하지는 않았지만, 반복되는 것으로 보아 어디선가 메모리 누수가 나고 있는 것으로 보여 Heap Dump를 분석하기로 결정했습니다.

image

01. 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라는 확장자로 생성된 것을 확인할 수 있습니다.

02. MAT 설치

.hprof 파일 분석을 위해 eclipse 홈페이지에서 MAT을 설치합니다.

윈도우 환경이어서 Windows (x86_64) 파일을 설치했으며, 설치 버전은 1.14.0 입니다.

image

설치 완료 후 실행하면 다음과 같은 화면을 볼 수 있습니다.

image

03. Heap Dump 분석

여러 메뉴 중 Open a Heap Dump를 클릭하고, .hprof 파일을 열어줍니다.

image

그러면 다음과 같은 Getting Started Wizard 화면이 뜨는데, 기본 설정을 그대로 유지한 채 Finish를 누릅니다.

image

그러면 다음과 같이 메모리 누수가 어디서 발생했는지에 대한 내용을 보여줍니다.

image

전체 내용을 분석해보면 Buffer에서 메모리 누수가 발생하고 있으며, 77.5MB로 매우 작은 양의 메모리가 누수되고 있음을 확인할 수 있습니다. 메모리가 증가하는 주요 원인은 메모리 누수가 아님을 알게 되었으며 다른 곳에서 원인을 찾아보기로 결정하였습니다.

참고