티스토리 뷰
Java 기반 어플리케이션을 사용하다보면은 Memory 관련된 이슈를 많이 마주하게 된다.
실제로 내가 운영하던 어플리케이션에서는 heap메모리를 사용 후 GC에 의한 정상적인 반환이 이루어지지 않았다.
아래 그래프를 보면은 특정 시간대에 발생하는 배치 작업으로 인해 Memory 사용이 증가한 이후 자동으로 감소하지 않는 모습을 보였다.
점차 Memory 사용량이 증가하다가 Max치에 도달하여 shutdown되고나서야 Memory 사용이 감소하는 것을 확인할 수 있다.(???)
처음에는 GC에 문제라고 판단하여 G1GC에서 CMS 알고리즘으로 변경하였지만 나아지는 기미가 보이지 않아 Memory Leak이 있다고 판단하였고 MAT를 통해서 어느 지점에서 Leak 발생하는지 분석하기로 하였다.
Memory Analyzer (MAT)
이클립스에서 제공해주는 Memory Analyzer이고 heap dump 파일을 업로드하면은 시각적인 자료로 분석 결과를 정리해준다.
java기반으로 동작하니 설치 페이지에서 가이드하는 java 17을 설치하고 Mat를 다운로드만 하면된다.
MAT download: https://eclipse.dev/mat/downloads.php
Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation
The Eclipse Foundation - home to a global community, the Eclipse IDE, Jakarta EE and over 415 open source projects, including runtimes, tools and frameworks.
eclipse.dev
그러면, 이제 분석하는 과정에 대해서 알아보자
~]$ jps -v
OR
~]$ ps -ef | grep java
로 PID 검색
~]$ jmap -dump:format=b,file=<파일명><PID>
먼저 문제가 되는 프로세스 PID 정보를 확인한다. 그러고 해당 PID를 통해서 .hprof 확장자 heap dump 파일을 얻을 수 있다.
파일 크기는 현재 프로세스가 사용중인 메모리 크기와 동일 하다.
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=./jvm.hprof
프로그램 실행시 해당 옵션을 사용하면은 OOM 발생시 자동으로 heap dump 파일을 생성한다. 파일 이름은 오버라이트될 수 있으니 적절히 변경하는 것이 좋다.
어떠한 방법으로든 heap dump 파일을 얻었으면 해당 파일을 MAT에서 열면 된다.
"File" > "Open Heap Dump"를 통해서 heap dump 파일을 연다.
그 후 Leak Suspects Report를 선택하여 자동으로 분석 결과를 확인한다.
위 그림처럼 어떤 영역에서 많은 사용량보이는지 대락적으로 확인할 수 있고, 자세히 확인시 어떤 class에서 많은 사용이 이루어지는지도 확인 할 수 있다.
TIP
haep dump 파일이 크다면은 분석하는 MAT도 많은 메모리를 필요로하게 된다.
가능하다면은 파일 크기에 약 2배 정도에 메모리를 MAT가 사용할 수 있어야 정상적인 분석이 가능하다.
메모리 크기를 설정하기 위해서는 'MemoryAnalyzer.ini'에 값을 변경한 이후 MAT를 실행하면 된다.
-Xms6144m
-Xmx8192m
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+CMSClassUnloadingEnabled
-XX:+UseCMSInitiatingOccupancyOnly
위 설정은 최소 메모리를 6GB에서 8GB를 사용하는 설정이다.
만약 이 정도 메모리 크기로도 분석이 불가능할 수도 있다. 그 경우에는 GUI 환경에서 실행하지말고 CLI를 통해서 단계별로 나누어서 실행한다면은 제한적인 리소스에서도 분석이 가능하다.
For UNIX:
./ParseHeapDump.sh /opt/heap_dump/jvm.hprof org.eclipse.mat.api:suspects
./ParseHeapDump.sh /opt/heap_dump/jvm.hprof org.eclipse.mat.api:overview
./ParseHeapDump.sh /opt/heap_dump/jvm.hprof org.eclipse.mat.api:top_components
For Windows:
ParseHeapDump.bat D:\heap_dump\jvm.hprof org.eclipse.mat.api:suspects
ParseHeapDump.bat D:\heap_dump\jvm.hprof org.eclipse.mat.api:overview
ParseHeapDump.bat D:\heap_dump\jvm.hprof org.eclipse.mat.api:top_components
위 방법으로 사용한다면은 많은 시간을 필요로 하지만, 적은 memory로 분석이 가능하다.
참고자료
https://eclipse.dev/mat/downloads.php
https://www.techpaste.com/2015/07/how-to-analyse-large-heap-dumps/
'CS' 카테고리의 다른 글
rm -rf로 인한 사고 방지 스크립트 (0) | 2024.01.09 |
---|
- Total
- Today
- Yesterday
- 빅데이터
- hdfs
- bigdata #data_mesh
- spark driver
- Discovery Rule
- OOM
- Dataflow
- exporter
- hadoop
- namenode
- lld
- zabbix
- Federation
- 실시간처리
- Apache Nifi
- flow.xml.gz
- Item Prototypes
- Nifi Architecture
- 설정에러
- Bigdata
- Nifi Service
- java8
- error
- nifi.flowcontroller.autoResumeState
- Apache
- nifi
- prometheus
- openjdk1.8
- MAT
- flink
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |