일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- AI
- 공부
- Java
- kotlin
- CloudWatch
- PETERICA
- Spring
- 정보처리기사 실기
- 기록으로 실력을 쌓자
- AWS EKS
- 정보처리기사실기 기출문제
- minikube
- Kubernetes
- 코틀린 코루틴의 정석
- aws
- Elasticsearch
- Pinpoint
- APM
- CKA 기출문제
- kotlin coroutine
- MySQL
- IntelliJ
- kotlin querydsl
- CKA
- kotlin spring
- 오블완
- Linux
- mysql 튜닝
- 정보처리기사 실기 기출문제
- 티스토리챌린지
- Today
- Total
피터의 개발이야기
[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
'Programming > Spring' 카테고리의 다른 글
[Spring] RestTemplate의 Connection Timeout 설정과 에러 패턴 (0) | 2024.11.14 |
---|---|
[Spring] Hadoop- Hive 컨넥션 유지 방법, @Scheduled (0) | 2024.10.28 |
[Spring] @Async를 활용한 비동기 처리 (0) | 2024.10.10 |
[Spring] Spring AOP 개념정리와 Pointcut 표현식 정리 (0) | 2024.08.25 |
[Spring] springboot에 외부 JAR 추가하기 (0) | 2024.08.23 |