아무거나

JVM Heap 모니터링 및 Heap Dump 분석 본문

Java & Kotlin/Java

JVM Heap 모니터링 및 Heap Dump 분석

전봉근 2023. 3. 9. 14:48
반응형

Heap 모니터링 및 Heap Dump 분석

Heap 모니터링

  1. OracleJDK 에서 제공하는 GUI 모니터링 툴 VisualVM 을 다운
  2. VisualVM 상단에 [Tools] - [Plugin]을 접속하여 VisualGC 플러그인을 다운
  3. 플러그인 다운이 끝났다면, 창을 종료하고 좌측 메뉴를 확인 후 프로세스 클릭
  4. Monitor 및 Visual GC 를 통하여 각 원하는 항목들을 모니터링한다.

Heap Dump 분석

  1. OOM 을 발생시킬 코드 작성
    [TestController.java]
package com.example.bkjeon;

import java.util.ArrayList;
import java.util.List;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @GetMapping("test")
    public Integer callTest() {
        List<OOMTest> students = new ArrayList<>();
        for (int i = 0; i < 100_000_000; i++) {
            students.add(new OOMTest(i, "test" + i));
        }
        return students.size();
    }

}

[OOMTest.java]

package com.example.bkjeon;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class OOMTest {
    private final Integer id;
    private final String name;
}
  1. 해당 코드를 실행하면 java.lang.OutOfMemoryError: Java heap space 에러가 발생한다.
  2. 이제 OOM 발생 시 자동으로 Heap Dump 를 생성하게 만들자.
// Application 구동시 VM Options 에 하기 명령어를 추가하자. (2번째 명령은 heapdump 파일이 저장될 경로이다.)
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/Users/lotte/Desktop/heapdump.hprof

상기 API 를 실행하면 아래와 같이 OOM 이 발생하며 Dump 파일을 생성한다. (단, OOM 이 발생하지 않는경우 JVM 메모리 사이즈를 줄여보자. Ex) -Xms256M -Xmx256M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/lotte/Desktop/heapdump.hprof)

  1. 이제 생성된 heapdump 파일을 Eclipase Memory Analyzer(MAT) 툴을 사용하여 실행해보자.

    여기서 Open a Heap Dump 버튼을 클릭하여 진행하자.

주의할점은 MAT 툴이 할당할 수 있는 메모리의 크기가 분석하려는 HeapDump 크기보다 커야하므로 압축해제한 디렉토리에서 MemoryAnalyzer.ini 파일을 실행하여 Xmx 크기를 적절하게 조절하자.

-vmargs
-Xmx15G
-XX:-UseGCOverheadLimit
  1. 분석이 끝나면 원 그래프와 다양한 기능들이 표시된다.
  2. 하단에 있는 Dominator Tree를 클릭하면 Heap Dump를 뜰 당시에 만들어진 Java 객체를 한 눈에 확인할 수 있다.

사용량이 매우 높은 객체를보니 OOMTest 객체가 200 만개나 만들어진 것을 확인할 수 있다.








 

반응형
Comments