JAVA

[OOM] Out Of Memory 분석 방법(with MAT)

내나위 2024. 9. 20. 11:06
728x90
반응형
SMALL

heap dump 생성 및 분석

 

1. 샘플 파일 생성(OutOfMemoryExample.java)

import java.util.ArrayList;
import java.util.List;
 
public class OutOfMemoryExample {
    public static void main(String[] args) {
        List<Object> memoryLeak = new ArrayList<>();
        while (true) {
            memoryLeak.add(new Object()); // Continuously adding objects to the list
        }
    }
}

 

2. 컴파일(OutOfMemoryExample.class 생성)

javac OutOfMemoryExample.java

 

3. 실행

java -cp D:\heap_dump -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heap_dump -Xmx50m OutOfMemoryExample
-> 클래스가 패키지가 없을 시 클래스 경로 명시(-cp D:\heap_dump)
 
D:\heap_dump>java -cp D:\heap_dump -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heap_dump -Xmx50m OutOfMemoryExample
java.lang.OutOfMemoryError: Java heap space
Dumping heap to D:\heap_dump\java_pid23596.hprof ...
Heap dump file created [61431119 bytes in 0.084 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:3210)
        at java.util.Arrays.copyOf(Arrays.java:3181)
        at java.util.ArrayList.grow(ArrayList.java:267)
        at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:241)
        at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:233)
        at java.util.ArrayList.add(ArrayList.java:464)
        at OutOfMemoryExample.main(OutOfMemoryExample.java:8)

 

4. 결과(heap dump 파일 생성(58.5MB))

java_pid23596.hprof 

 

5. 메모리 분석기(MAT(Memory Analyzer Tool))

  -. MAT 다운로드 경로 : https://eclipse.dev/mat/

  -. JDK 다운로드 경로 : https://www.openlogic.com/openjdk-downloads

  -. 분석 결과

  • Java_id23596.hprof 파일을 MAT에서 Open

MAT 실행 결과

 

  • Leak Suspects 리포트 확인
  • 메모리 영역에 98.7% 차지하는 Object[]가 쌓여 있는 것 확인

Leak Suspects

  • Dominator Tree를 확인해 보면 Object[1823230]가 생성되었는 것을 확인할 수 있다

Dominator Tree

  • Stack Trace를 통해서 에러가 발생하는 시점을 확인할 수 있다

Stack Trace
Out Of Memory 분석 방법.docx
0.16MB

728x90
반응형
LIST