테스트코드 & 정적분석

JVM 메모리 덤프 생성 및 분석

백엔드 유성 2023. 8. 13. 21:41

JVM이 동작하는 프로세스의 메모리 덤프를 생성하는 방법을 살펴보겠습니다.


먼저, 현재 실행 중인 JVM 프로세스들을 확인합니다.

 

$ jps -l

 

여러 프로세스가 있습니다.

 

다양한 프로세스들이 보이겠지만, 저는 spring-batch 프로젝트에 대한 덤프를 미리 생성해두었습니다.

만약 kafka와 같은 다른 프로세스에 대해 덤프를 생성하고자 한다면 다음 명령어를 사용하면 됩니다:

 

$ jmap -dump:format=b,file=/path/file.hprof 2501

 

 

여기서 format은 binary를 의미하며, 2501은 프로세스 ID입니다. jmap은 JDK에서 제공하는 유용한 도구입니다.

 

주의사항
 - 덤프를 생성하는 도중에는 성능 저하가 발생할 수 있습니다.
 - 생성된 덤프 파일의 크기는 JVM이 사용 중인 힙 메모리 크기와 거의 동일합니다. 대규모 프로젝트에서는 디스크 공간을 미리 확보하고 진행하세요.

 

이제 file.hprof 파일을 가져와서 메모리 분석 도구로 열어볼 차례입니다. VisualVM, Yourkit, Eclipse Memory Analyzer 등 다양한 도구가 있습니다.

 

저는 Intellij 내장된 VisualVM 플러그인을 사용해서 분석해보겠습니다. 분석 결과, h2 인메모리 DB가 상당한 힙 메모리를 차지하는 것을 확인할 수 있었습니다.

h2 메모리 사용량 약 500MB

 

현재 패키지에서 사용하는 메모리를 찾아보겠습니다.

 

제 프로젝트에서 Settlement 객체가 10,000개 생성되어 약 1.04MB의 메모리를 차지하고 있습니다.

만약 이 객체의 생성을 줄일 수 있다면 메모리 사용량 감소에 도움을 줄 수 있습니다.

 

감사합니다.