☕JAVA/🔎 공부 [JAVA]

[JAVA] Heap 모니터링 & Heap Dump 분석하기

디카페인라떼 2022. 10. 26. 22:00
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