Java Application을 개발해 운용해 보면, 메모리 누수, 즉, OutOfMemoryError를 경험하는 경우가 있다.
그 중에서도 힙 메모리 공간이 부족하여 발생하는 에러인 java.lang.OutOfMemoryError: Java 힙 공간이 발생했을 때 HeapDump 분석을 수행하는 방법을 요약한다.
Heap Dump 분석 – Jmap & Eclipse Memory Analyzer(MAT)
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError 예외는 메모리 누수 상황이 발생할 때 발생하며, 그 중에서도 Java 힙 공간 예외는 JVM의 힙 공간이 부족한 예외입니다.
힙은 서버를 구동할 때 향후 사용할 메모리를 미리 할당하게 되지만, 설정한 최대 힙 메모리 용량을 초과하면 해당 오류가 발생할 수 있습니다.
해당 에러가 발생해도 무조건 메모리 누수를 의미하는 것은 아니다.
순간적으로 힙 메모리 사용량이 증가하여 발생했을 가능성이 있으며, 실장상의 버그에 의해 GC(Garbage Collection)가 과도하게 일어나 성능이 저하되어 발생하는 경우도 있다.
java.lang.OutOfMemoryError : Java 힙 공간 문제 해결 방법에 JVM 옵션에서 힙 옵션을 늘려 해결하는 방법도 있지만, 그 방법은 실제로 그 서비스 내에서 필요한 힙의 크기를 작게 설정했을 때의 문제 해결 방법이기 때문에 근본적인 원인 해결 방법이 아니기 때문에 무작위로 크게 늘릴 수 없다.
(JVM Heap Option에 대해서는 다음 기사 참조)
JVM Heap Option
이러한 경우에 힙이 높은 사용량을 만든 원인을 알아내기 위해 할 수 있는 방법이 힙덤프를 이용해 분석하는 방법이다.
HeapDump
HeapDump는 특정 시섬에서 Heap 메모리 사용량을 파일로 저장합니다.
HeapDump를 분석하면 메모리를 어디에서 많이 사용하고 있는지 확인할 수 있습니다.
HeapDump 파일을 생성하고 분석하는 방법에는 여러 가지가 있지만 그 중에서도 Jmap을 이용하여 HeapDump 파일을 생성하고 생성된 파일을 Eclipse Memory Analyzer(이하 MAT)를 통해 확인하는 방법을 살펴보겠습니다.
여기서, Jmap이란 JDK에 포함되는 툴로, 현재 실행중의 Java 프로세스의 힙 덤프를 생성할 수 있도록 한다.
그리고 MAT는 힙 덤프 파일을 GUI를 통해 분석하는 데 도움이되는 도구입니다.
(참고에 JDK가 제공하는 툴인 Jhat를 통해서도 분석이 가능)
Jmap으로 HeapDump 파일 생성
먼저 HeapDump 파일을 생성하기 위해 Jmap을 사용하려면 파일을 검색하려는 프로세스의 ID인 PID를 알아야 합니다.
JPS 명령을 통해 JVM의 PID를 쉽게 확인할 수 있습니다.
jps or jps -v
이와 같이 확인한 pid를 이하의 명령에 넣어 HeapDump 파일을 생성해 준다.
jmap -dump:format=b,file=heapdump.hprof (PID)
다음과 같이 생성된 것을 확인할 수 있다.
(서버 내에서 확인을 원한다면 find 명령으로 파일을 확인하십시오.)
Heap Dump 파일 분석을 위한 Eclipse Memory Analyzer(MAT) 사용
먼저 아래 링크에서 다운을 받으십시오. 자신의 OS 환경에 맞춰 다운을 해준다.
https://www.eclipse.org/mat/downloads.php
다운 완료 후 MAT를 실행하면 다음과 같이 떠올라.
여기에서 아래의 Open a Heap Dump를 눌러 방금 만든 hemp dump 파일을 선택합니다.
(만약 ec2와 같은 리모트 서버에 있다면, 생성한 파일을 로컬로 다운해 실행해 준다.
)
선택 후 OK를 누르면 다음과 같이 분석합니다.
그 부분에서 하단의 Dominator Tree를 눌러준다.
이것에 의해, 다음과 같이 힙 덤프안에 작성된 Java 오브젝트를 한눈에 확인할 수 있습니다.
퍼센티지별로 정렬하므로 비정상적으로 높은 퍼센트를 차지하고 있는 객체를 찾아 힙의 높은 사용량을 만든 원인을 파악할 수 있다.
그리고 아이템을 타고 들어가면 더 정확한 객체를 확인할 수 있습니다.
게다가 이전에 정리한 VisualVM의 기사에서도, Heap Dump 파일에 관한 내용 외에, JVM의 메모리 분석에 관한 내용도 있으므로, 참고로 해 보면 좋다고 생각합니다.
VisualVM을 통한 원격 서버 도커의 JVM 성능 모니터링