- @참고: https://steady-coding.tistory.com/591
Heap 모니터링 도구
GUI 도구
- VisualVM: OracleJDK에서 제공하는 GUI 모니터링 툴
전반적인 CPU 사용량, Runtime Area 사용량을 볼 수 있다.
- JConsole: JDK에서 제공
데이터를 csv 형태로 저장할 수 있음
관측은 4초에 한번씩 실행됨
명령어 도구
- jstat: JDK에서 제공
// 현재 JVM 에서 실행되고 있는 application의 PID 목록 가져오기
$ jps
26532 HeapDumpApplication
... 중략
// GC 통계 정보 출력하기
$ jstat -gc 26532
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
0.0 0.0 0.0 0.0 28672.0 10240.0 40960.0 9744.5 36784.0 34801.9 4864.0 4223.8 52 3.302 16 43.246 46.549
// GC 사용량 출력하기
$ jstat -gcutil 26532
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 35.71 23.79 94.61 86.84 52 3.302 16 43.246 46.549
// 5개씩 출력할 때마다 헤더를 출력하고, 1초마다 출력하되, 10개의 결과를 보여주기
$ jstat -gcutil -h5 26532 1000 10
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 35.71 23.79 94.61 86.84 52 3.302 16 43.246 46.549
0.00 0.00 35.71 23.79 94.61 86.84 52 3.302 16 43.246 46.549
0.00 0.00 35.71 23.79 94.61 86.84 52 3.302 16 43.246 46.549
0.00 0.00 35.71 23.79 94.61 86.84 52 3.302 16 43.246 46.549
0.00 0.00 35.71 23.79 94.61 86.84 52 3.302 16 43.246 46.549
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 35.71 23.79 94.61 86.84 52 3.302 16 43.246 46.549
0.00 0.00 35.71 23.79 94.61 86.84 52 3.302 16 43.246 46.549
0.00 0.00 35.71 23.79 94.61 86.84 52 3.302 16 43.246 46.549
0.00 0.00 35.71 23.79 94.61 86.84 52 3.302 16 43.246 46.549
0.00 0.00 35.71 23.79 94.61 86.84 52 3.302 16 43.246 46.549
- gc 옵션 시 데이터 의미
- gcutil 옵션 시 데이터 의미
Heap Dump 뜨기
Visual VM에서 뜰 수 있으나 OOM인 경우, 갑작스럽게 메모리 사용량이 크게 증가하는 순간에 사용할 수 없다.
1. jmap
jmap -dump:format=b,file=heapdump.hprof 26532
2. VM Options 추가
OOM 발생 시 자동 Heap Dump 생성을 위해서
VM Options 로 아래 옵션을 추가한다.
-XX:+HeapDumpOnOutOfMemoryError
//생략시 어플리케이션 실행한 루트 디렉토리에 dump 파일이 생성됨
-XX:HeapDumpPath=c:/dump/heapdump.hprof
Heap Dump 분석하기
1. MAT(Eclipse Memory Analyzer) 툴을 이용하여 분석
MAT 툴이 할당할 수 있는 메모리 크기가 분석하려는 heap dump 파일 크기보다 켜야하므로 MemoryAnalyzer.ini 파일에서 아래와 같이 Xmx 크기를 세팅할 수 있다.
-vmargs
-Xmx15G
-XX:-UseGCOverheadLimit
Dominator Tree 로 Heap Dump 뜰 당시에 만들어진 Java 객체를 한 눈에 확인 할 수 있다.
'Java' 카테고리의 다른 글
[Java] 연산자 우선순위 (0) | 2022.12.18 |
---|---|
[Java] LocalDateTime, Timestamp 변환 (0) | 2021.02.26 |
[Java] Set to List, List to Set (0) | 2021.02.25 |
[Java] Optional 사용법 (0) | 2021.02.19 |
[Java] 파일 입출력 (0) | 2021.01.27 |