heap이 증가하면서 hang이 발생한 상황에서 log만으로 분석이 어려운 상황일 때
heap dump 파일을 생성하여 메모리누수 원인을 파악해보겠습니다.
📌1. 메모리 누수 발생
grafana, visualVM으로 분석도중 GC가 메모리를 정리하지 못하고
heap 메모리가 과도하게 늘어나는것을 발견했습니다.
물론 이러다가 설정한 GC Config의 max 수치를 넘어가면 프로세스에서
hang이 발생하면서 멈춰버립니다.

📌2. visualVM 프로그램 - Heap Dump 파일생성
visualVM 프로그램에서 Heap Dump 파일을 띄워봅니다.
Monitor 탭에서 'Heap Dump' 버튼을 클릭하면
분석파일이 프로세스가 실행되고 있는 서버의 /tmp 하위에 저장됩니다.

주의할 점은 프로세스가 종료되면 visualVM도 함께 멈추면서 heapdump 파일을 띄울 수 없으니,
OOM이 발생하기전에 어느정도 분석이 가능한 시점에 heapdump를 생성합니다.
📌3. scp로 서버에서 로컬로 파일이동
HeapDump 파일을 scp로 로컬로 받아옵니다.
1) 검증서버에서 게이트웨이로 전송
cd /tmp
scp -P 9922 hura@172.31.1.145:/tmp/heap* .
계정 암호입력
2) 로컬에서 게이트웨이의 파일을 가져옴
scp -P 2922 herit@13.209.109.59:/home/herit/heap* .
계정 암호입력
📌4. Eclipse MAT 다운로드
HeapDump 파일을 분석할 수 있는 EclipseMAT 프로그램입니다.
다운로드 링크 : https://eclipse.dev/mat/download/previous/
버전 : 1.8.1 (JDK 버전 동일하지않으면 실행되지 않습니다)

📌5. EclipseMAT 실행
EclipseMAT을 실행하고 로컬로 받아온 heapdump 파일을 열어줍니다.(.hprof)
프로그램명 : MemoryAnalyzer.exe
실행경로 : \MemoryAnalyzer-1.8.1.20180910-win32.win32.x86_64\mat


📌6. 분석방법
- Suspect로 분석된 부분이 주 원인입니다.
- Problem Suspect라고 적혀진 노란창의 Details를 클릭하면 상세한 분석내용이 조회됩니다.
- Suspect로 분석된 부분을 파악하여 관련부분 코드를 수정합니다.
- Suspect는 하나뿐 아니라 여러개로 발견될 수 있습니다.
저의 경우에는 통계개선코드를 추가하는 과정에서
KafkaConsumer에 추가했던 테스트용 코드를 지우는 것을 깜빡했는데요.
add문이 consume을 받을때마다 쌓이면서, Eclipse MAT 프로그램 분석결과에서도
KafkaConsumer에 너무 많은 객체가 쌓이고 있다고 분석되었습니다.
Problem Suspect 1
One instance of "net.herit.ami.features.batch.kafka.KafkaConsumer" loaded by "org.springframework.boot.loader.LaunchedURLClassLoader @ 0xea660000" occupies 173,270,328 (83.54%) bytes. The memory is accumulated in one instance of "java.lang.Object[]" loaded by "<system class loader>".
Keywords
org.springframework.boot.loader.LaunchedURLClassLoader @ 0xea660000
java.lang.Object[]
net.herit.ami.features.batch.kafka.KafkaConsumer
KafkaConsumer 코드 개선 이후
GC가 정상적으로 Heap Memory를 감당하는중
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

- 분석방법 참조
https://incheol-jung.gitbook.io/docs/q-and-a/java/heap-dump-feat.-oom
https://shonm.tistory.com/646
https://blog.yevgnenll.me/posts/heap-dump-out-of-memory
https://blueyikim.tistory.com/1242
'Coding > Back-end' 카테고리의 다른 글
VisualVM | 리눅스서버에 올린 프로세스에 붙어 모니터링하기 (1) | 2025.03.20 |
---|---|
로컬에서 리눅스 서버로 파일 옮기기 | SCP • SFTP (0) | 2025.03.19 |
[Jmeter] 요청 전송주기 설정 라이브러리 - Timer 설정 (0) | 2025.03.13 |
[IntelliJ] AWS 프로젝트 Clone 하기 - CLI 명령어 | Console CodeCommit Repository (0) | 2025.03.10 |
[Jmeter] apache jmeter에서 host에 접근하지 못할때 | dev-kafka 오류 | di-kafkameter 오류 | jmeter timeout exception (0) | 2025.03.07 |