Programming/Spring

[Spring] embedded Tomcat을 사용할 때 메모리가 누적 경우

기록하는 백앤드개발자 2024. 10. 22. 10:10
반응형

ㅁ 들어가며

ㅇ 연동된 시스템의 지연 사항을 점검하면서 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

 

반응형