Heap Memory 모니터링 & Heap Dump
- Spring으로 개발한 웹어플리케이션을 운영하다보면, 어떠한 이유로 사용하지 않는 메모리가 쌓이면서 메모리 누수현상이발생할 수 있다.
- 이를 방치하면 GC(Garbage Collection)가 과도하게 일어나면서 어플리케이션의 성능이 저해되거나, 심한 경우에는 OOM(Out Of Memory)이 발생하여 결국 어플리케이션이 죽게 된다.
- 따라서 주기적으로 Heap 영역을 모니터링하고, 의심되는 상황이 있다면 Heap Dump를 떠서 어떤 객체가 원인이 분석해야 한다.
- 즉 장애가 났을 때의 Heap 상태를 기록으로 남겨 그 당시에 어떤 Java 객체들이 많이 만들어졌는지 분석해보아야 한다.
Heap Dump 파일 추출하는 방법
- Java Application 실행 시 옵션을 추가하여 자동으로 생성하게 하는 방법
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=<file-or-dir-path>
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log -jar Application.jar
=> OOM에러시마다 /var/log 경로에 HeapDump.hprof 파일이 쌓인다
- OOM 에러 발생 시 Heap Dump 파일 추출
$ jmap -dump:format=b,file=[FILE_NAME] [PID]
Heap Dump 분석하기
- "Open a Heap Dump" 를 클릭한 후, 앞서 생성한 Heap Dump 파일을 Open한다.
이 과정에서 몇 분정도 소요되고, 파일의 크기가 크면 클수록 더 많은 시간이 소요된다. - Heap Dump 파일이 있는 경로에 다량의 *.index 이름의 인덱스 파일이 생성이 되는데 이때 당황하지 않고, Heap Dump 분석이 끝난 후 모두 삭제해주면 된다.
- 이때 주의할 점이 MAT 툴이 할당할 수 있는 메모리의 크기가 분석하려는 Heap Dump 크기보다 커야 한다.
- 따라서 위에서 압축 해제한 루트 디렉토리에서 MemoryAnalyzer.ini 파일을 실행하여 Xmx 크기를 적절하게 조절한다.
-vmargs
-Xmx15G
-XX:-UseGCOverheadLimit
- "Leak Suspects" 를 누르면 자동으로 메모리 누수가 의심되는 용의자를 찾아서 알려준다.
- 나의 경우 한가지 밖에 없어서 하나로만 나왔지만 메모리 누수의 원인이 다양한 경우도 있다.
- 하단의 Details를 누르면 당시에 만들어진 객체들을 한 눈에 볼 수 있다.
- 어느 시점에 어떤 객체가 생성되어 문제가 된건지 객관적으로 판단할 수 있다.
참고 블로그
'☕JAVA > 🔎 공부 [JAVA]' 카테고리의 다른 글
[JAVA] JVM의 구조 와 메모리 구조 (0) | 2022.10.26 |
---|---|
[JAVA] BigDecimal 과 사칙연산 (0) | 2022.09.14 |
[JAVA] List 중복 제거 (0) | 2022.09.01 |
[JAVA] 제네릭 Generic (0) | 2022.08.26 |
[JAVA] Map, HashMap (0) | 2022.08.24 |