스프링 프로젝트를 진행하는데 서버 사양이 넉넉한 편이 아니었다. 그래서 메모리가 소중한 상황이었는데, 서버를 가동 시킨 후 메모리 사용량이 점점 늘어나는 상황이었다.
최초 실행시에는 약 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의 메모리 사용량을 제한 해 주면 될 것 같습니다.
정확한 원인을 찾지는 못하였으나 위의 과정을 통해 자바의 메모리 관리와 가비지 컬렉터에대해 더욱 공부 할 수 있었습니다.
'Java' 카테고리의 다른 글
Java Spring WebFlux + MySQL CRUD 예제 (0) | 2024.06.16 |
---|---|
Spring Cloud Gateway 기본적인 사용 방법 (0) | 2024.06.12 |
자바 멀티 스레드 프로그래밍 (0) | 2024.05.20 |
Java float와 double의 부동소수점 연산 차이 (0) | 2024.05.18 |
스프링은 신이고 나는 x신이다. (2) | 2024.01.30 |