MAT으로 Java Heap Dump 분석하기 (Memory Leak 문제 해결기)
MAT란 뭘까?
MAT은 Eclipse 기반의 Java 메모리 분석 도구이다. Java 프로그램의 메모리 사용량 및 성능을 분석하는 데 사용이 되는데 특히나 heap memory 분석을 하면 의심되는 것도 말해주고 아주 크게 도움이 될 것 같았기에 얼른 다운로드 받았다.
HeapDump 가져오기
우선! 운영환경이 다시 메모리가 차오르기를 기다렸다. 그리고 메모리가 어느정도 많이 찼을때 운영환경의 shell 으로 들어가서 아래의 command 를 입력한다.
1
jmap -dump:file=prod_mem.hprof {process id}
그럼 일정시간뒤에 prod_mem.hprof 라는 메모리 덤프를 받을 수 있다.
MAT 으로 분석하고 문제 해결하기!
가져온 hprof 파일을 MAT 에 넣는다. 그러자 브라우저 알람을 위해 주가 되었던 SSE 코드쪽에서 문제가 있었다.
원래는 새롭게 SseEmitter 를 만들어서 그냥 넣어주기만 했는데
1
CLIENTS.put(id, new SseEmitter());
이것을 아래와같이 수정하였다!
1
2
3
4
5
if(CLIENTS.containsKey(id)) {
SseEmitter sseEmitter = CLIENTS.remove(id);
sseEmitter = null;
}
CLIENTS.put(id, new SseEmitter());
이런식으로 어떤 사람 id 에 해당하는 SseEmitter 를 map 으로 저장을 했는데 그 사람의 SseEmitter 가 달라졌을때 새롭게 map 에 put 하는 과정에서 사용되지 않는 SseEmitter 가 Garbage Collection 대상이 되지 않았던것으로 판명이 났다! 새롭게 put 을 해줄때 이전걸 null 로 만들어주는 것으로 해결을 했다. 정말… 기나긴 싸움이었다….
This post is licensed under CC BY 4.0 by the author.