-
Notifications
You must be signed in to change notification settings - Fork 0
Description
User
eb로 배포했는데
인스턴스 메모리가 다음과 같아
[root@ip-172-31-9-135 ~]# free -m
total used free shared buff/cache available
Mem: 949 603 64 164 281 53
Swap: 1023 34 989
Cursor
안녕하세요! Elastic Beanstalk 환경에서 스프링 부트 애플리케이션의 메모리 사용량이 예상보다 높게 나오는 문제에 대해 함께 살펴보겠습니다. 요청이 없는 상황에서도 메모리 사용량이 높은 데에는 몇 가지 일반적인 원인이 있습니다.
가장 먼저, 스프링 부트 애플리케이션 자체의 구성이 메모리 사용량에 큰 영향을 줍니다. 어떤 설정들이 메모리를 사용하고 있는지 application.yml 파일을 확인하여 데이터베이스 설정이나 다른 연동 서비스들을 파악해보겠습니다. 이를 통해 문제의 원인을 좁혀나갈 수 있습니다.
application.yml 파일을 살펴보니 몇 가지 주목할 점이 보입니다.
- 다양한 외부 서비스 연동:
- AWS S3
- Kakao OAuth2
- Firebase
- SpringDoc (Swagger UI)
이처럼 다양한 서비스와 연동하면, 해당 SDK(라이브러리)들이 메모리에 로드되면서 기본적으로 차지하는 메모리 양이 늘어납니다.
- 데이터베이스 커넥션 풀:
dev프로필에서 HikariCP 데이터베이스 커넥션 풀을 최대 5개까지 사용하도록 설정했습니다. 각 커넥션은 일정량의 메모리를 소모합니다. - JVM 메모리 설정 부재:
application.yml파일이나 제공해주신 CI/CD 워크플로우에는 JVM의 힙 메모리 크기(-Xms,-Xmx)를 직접 설정하는 부분이 없습니다.
결론적으로, 현재 메모리 사용량이 높은 가장 유력한 원인은 다음과 같습니다.
Java 애플리케이션(JVM)은 시작될 때 운영체제로부터 일정량의 메모리(힙 메모리)를 할당받습니다. 만약 이 크기를 명시적으로 지정하지 않으면, JVM은 인스턴스의 전체 메모리 중 일정 비율(예: 1/4)을 최대로 사용하려고 시도합니다. 현재 사용 중인 인스턴스는 1GB의 메모리를 가지고 있으므로, JVM은 시작 시 수백 MB의 메모리를 예약할 수 있습니다.
여기에 스프링 부트가 애플리케이션 컨텍스트를 초기화하고, 설정된 모든 빈(Bean)을 로드하며, 데이터베이스 커넥션 풀을 생성하는 과정에서 추가적인 메모리를 사용하게 됩니다. 이 모든 것이 합쳐져 현재와 같이 높은 메모리 사용량을 보이는 것으로 추정됩니다.
Procfile 파일 수정으로 JVM 메모리 옵션 설정 가능
web: java -Xms256m -Xmx256m -jar *.jar-Xms256m 로 옵션 변경. 최소, 최대 설정 가능.