일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- redis
- AWS
- Gradle
- JVM
- ubuntu
- tool
- 맛집
- php
- Web Server
- it
- Spring Boot
- 요리
- Git
- jenkins
- devops
- elasticsearch
- MySQL
- jsp
- javascript
- springboot
- java
- linux
- IntelliJ
- db
- Spring
- Design Patterns
- Oracle
- ReactJS
- Spring Batch
- laravel
Archives
- Today
- Total
아무거나
JVM Heap 모니터링 및 Heap Dump 분석 본문
반응형
Heap 모니터링 및 Heap Dump 분석
Heap 모니터링
- OracleJDK 에서 제공하는 GUI 모니터링 툴 VisualVM 을 다운
- VisualVM 상단에 [Tools] - [Plugin]을 접속하여 VisualGC 플러그인을 다운
- 플러그인 다운이 끝났다면, 창을 종료하고 좌측 메뉴를 확인 후 프로세스 클릭
- Monitor 및 Visual GC 를 통하여 각 원하는 항목들을 모니터링한다.
Heap Dump 분석
- 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;
}
- 해당 코드를 실행하면 java.lang.OutOfMemoryError: Java heap space 에러가 발생한다.
- 이제 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)
- 이제 생성된 heapdump 파일을 Eclipase Memory Analyzer(MAT) 툴을 사용하여 실행해보자.
여기서Open a Heap Dump
버튼을 클릭하여 진행하자.
주의할점은 MAT 툴이 할당할 수 있는 메모리의 크기가 분석하려는 HeapDump 크기보다 커야하므로 압축해제한 디렉토리에서 MemoryAnalyzer.ini 파일을 실행하여 Xmx 크기를 적절하게 조절하자.
-vmargs
-Xmx15G
-XX:-UseGCOverheadLimit
- 분석이 끝나면 원 그래프와 다양한 기능들이 표시된다.
- 하단에 있는 Dominator Tree를 클릭하면 Heap Dump를 뜰 당시에 만들어진 Java 객체를 한 눈에 확인할 수 있다.
사용량이 매우 높은 객체를보니 OOMTest 객체가 200 만개나 만들어진 것을 확인할 수 있다.
반응형
'Java & Kotlin > Java' 카테고리의 다른 글
Redis 성능 개선을 위한 GZIP 압축 로직을 적용시 Native OOM 이슈에 대한 분석 (0) | 2023.07.26 |
---|---|
JDK8 에서 Perm 영역 삭제와 Metaspace 영역의 추가 (0) | 2023.07.17 |
Setter 사용을 지양하자. (0) | 2022.11.26 |
Spring Batch 6편 - Chunk-Oriented Processing (0) | 2022.11.06 |
Java Stream 이란 (0) | 2022.08.11 |
Comments