[Spring] embedded Tomcat을 사용할 때 메모리가 누적 경우
ㅁ 들어가며
ㅇ 연동된 시스템의 지연 사항을 점검하면서 Spring Boot embeded Tomcat의 경우 메모리가 누적되면서 지연되는 경우믈 발견하였다.
ㅇ Spring Boot의 임베디드 Tomcat을 사용할 때 메모리가 누적되는 현상에 대해 몇 가지 주요 원인과 해결 방법을 정리하였다.
ㅁ 메모리 누수 (Memory Leak)
ㅇ 원인: 애플리케이션 코드에서 적절히 리소스를 해제하지 않거나, 순환 참조 등으로 인해 발생할 수 있다.
ㅇ 해결방법:
- 힙 덤프를 분석하여 메모리 누수 지점을 찾아야 한다.
- 코드 리뷰를 통해 리소스 해제가 제대로 이루어지는지 확인한다.
- 순환 참조를 제거해야 한다.
ㅁ 부적절한 GC 설정
ㅇ 원인: GC 설정이 애플리케이션의 특성에 맞지 않아 메모리 회수가 제대로 이루어지지 않을 수 있다.
ㅇ 해결방법:
- GC 로그를 분석하여 GC 동작을 모니터링한다.
- 애플리케이션 특성에 맞는 GC 알고리즘을 선택한다 (예: G1GC).
- GC 관련 JVM 옵션을 조정한다.
ㅁ 과도한 캐시 사용
ㅇ 원인: 애플리케이션에서 과도하게 캐시를 사용하여 메모리를 점유할 수 있다.
ㅇ 해결방법:
- 캐시 크기를 제한한다.
- 만료 정책을 적용하여 오래된 캐시 항목을 제거한다.
- 필요한 경우 외부 캐시 시스템(예: Redis)을 사용한다.
ㅁ 대용량 세션 데이터
ㅇ 원인: 세션에 많은 양의 데이터를 저장하면 메모리 사용량이 증가할 수 있다.
ㅇ 해결방법:
- 세션에 저장하는 데이터를 최소화한다.
- 세션 타임아웃을 적절히 설정한다.
- 필요한 경우 외부 세션 저장소를 사용한다.
ㅁ 스레드 풀 설정 문제
ㅇ 원인: 과도하게 많은 스레드를 생성하면 메모리 사용량이 증가할 수 있다.
ㅇ 해결방법:
- Tomcat의 스레드 풀 설정을 조정한다 (예: maxThreads, minSpareThreads).
- 비동기 처리를 활용하여 스레드 사용을 최적화한다.
ㅁ 힙 메모리 설정
ㅇ 원인: 힙 메모리 설정이 부적절하면 메모리 사용량이 계속 증가할 수 있다.
ㅇ 해결방법:
$ java -Xmx32m -Xss256k -jar target/demo-0.0.1-SNAPSHOT.jar
- -Xms와 -Xmx 값을 적절히 설정한다.
- 애플리케이션의 실제 메모리 사용량을 모니터링하고 그에 맞게 조정한다.
ㅁ 마무리
이러한 방법들을 통해 Spring Boot 임베디드 Tomcat의 메모리 누적 현상을 해결하거나 완화할 수 있다.
문제 해결을 위해서는 지속적인 모니터링과 프로파일링이 중요하다.
ㅁ 함께 보면 좋은 사이트
ㅇ reduce spring-boot app memory consumption
ㅇ Spring boot embedded tomcat server take over 800 MB RAM?
ㅇ Spring Boot Memory Performance