본문 바로가기

Java

자바 프로세스 메모리 증가

스프링 프로젝트를 진행하는데 서버 사양이 넉넉한 편이 아니었다. 그래서 메모리가 소중한 상황이었는데, 서버를 가동 시킨 후 메모리 사용량이 점점 늘어나는 상황이었다. 

최초 실행시에는 약 150mb의 메모리를 점유 하고 있었는데 점점 시간이 지나면서 300mb이상 메모리를 점유하기 시작했던 것이다.

 

1. 메모리 사용량 분석 방법

heapdump 파일 받는 방법

확장자는 hprof를 사용합니다.

./jmap -dump:format=b,file={파일 명} {pid}

 

PID같은 경우에는 

ps -ef | grep java

를 사용하면 쉽게 가져올 수 있습니다.

 

메모리 분석 툴 Eclipse Memory Analyzer를 활용하여 누수를 확인 해 보았습니다.

설치 링크

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

 

2. 가비지 컬렉터 작동 로그

jstat ‐gcutil {pid} {interval}

파일로 로그를 저장 하기 위해서는

jstat ‐gcutil {pid} {interval} >> {파일 명}

위의 명령어를 사용하면 됩니다.

메모리 사용량이 처음 약 300mb에서 500mb까지 증가 후 더 이상 증가가 되지 않는 것을 보아 메모리가 일정량 채워질 때까지 올드 영역을 비우지 않고 계속해서 채워지는 것 같습니다.

제 생각에는 사용하지 않는 객체에 대하여 바로 할당을 해제 할 것 같았지만 그렇지 않고 계속 들고 있던 것으로 생각이 들었습니다.

만약 메모리가 소중한 상황이었으면 JVM의 메모리 사용량을 제한 해 주면 될 것 같습니다.

정확한 원인을 찾지는 못하였으나 위의 과정을 통해 자바의 메모리 관리와 가비지 컬렉터에대해 더욱 공부 할 수 있었습니다.