메모리 부족 문제로 인한 앱 다시 시작 문제
참고 항목
기본, 표준 및 엔터프라이즈 계획은 2025년 3월 중순부터 사용되지 않으며 3년의 은퇴 기간이 있습니다. Azure Container Apps로 전환하는 것이 좋습니다. 자세한 내용은 Azure Spring Apps 사용 중지 공지 사항을 참조하세요.
표준 소비 및 전용 계획은 2024년 9월 30일부터 사용되지 않으며 6개월 후에 완전히 종료됩니다. Azure Container Apps로 전환하는 것이 좋습니다. 자세한 내용은 Azure Spring Apps 표준 사용량 및 전용 계획을 Azure Container Apps로 마이그레이션을 참조 하세요.
이 문서는 기본/표준 ✅ 엔터프라이즈에✅ 적용됩니다.
이 문서에서는 Azure Spring Apps의 Java 애플리케이션에 대한 OOM(메모리 부족) 문제를 설명합니다.
메모리 부족 문제 유형
메모리 부족 문제에는 컨테이너 OOM과 JVM OOM의 두 가지 유형이 있습니다.
시스템 OOM이라고도 하는 컨테이너 OOM은 사용 가능한 앱 메모리가 부족할 때 발생합니다. 컨테이너 OOM 문제로 인해 Azure Portal의 Resource Health 섹션에서 보고되는 앱 다시 시작 이벤트가 발생합니다. 일반적으로 컨테이너 OOM은 잘못된 메모리 크기 구성으로 인해 발생합니다.
JVM OOM은 사용된 메모리의 양이 JVM 옵션에서 설정된 최대 크기에 도달했을 때 발생합니다. JVM OOM으로 인해 앱이 다시 시작되지 않습니다. 일반적으로 JVM OOM은 애플리케이션 로그에서
java.lang.OutOfMemoryError
예외를 검색하여 찾을 수 있는 잘못된 코드의 결과입니다. JVM OOM은 Java Flight Recorder와 같은 애플리케이션 및 Java 프로파일링 도구에 부정적인 영향을 줍니다.
이 문서에서는 컨테이너 OOM 문제를 해결하는 방법에 중점을 둡니다. JVM OOM 문제를 해결하려면 힙 덤프, 스레드 덤프 및 Java Flight Recorder와 같은 도구를 확인합니다. 자세한 내용은 Azure Spring Apps에서의 힙 덤프 및 스레드 덤프의 수동 캡처 및 Java Flight Recorder 사용을 참조하세요.
OOM으로 인한 앱 다시 시작 문제 해결
다음 섹션에서는 컨테이너 OOM 문제를 진단하고 해결하는 데 사용할 수 있는 도구, 메트릭 및 JVM 옵션에 대해 설명합니다.
리소스 상태 페이지에서 경고 보기
Azure Portal의 리소스 상태 페이지에는 다음 스크린샷과 같이 컨테이너 OOM으로 인한 앱 다시 시작 이벤트가 표시됩니다.
메모리 크기 구성
메트릭 앱 메모리 사용량, jvm.memory.used
및 jvm.memory.committed
는 메모리 사용량 보기를 제공합니다. 자세한 내용은 메모리 문제를 해결하기 위한 도구의 메트릭 섹션을 참조하세요. JVM 옵션에서 최대 메모리 크기를 구성하여 메모리가 한도 미만인지 확인합니다.
Java 메모리 모델에 있는 모든 파트에 대한 최대 메모리 크기의 합계는 실제 사용 가능한 앱 메모리보다 작아야 합니다. 최대 메모리 크기를 설정하려면 Java 메모리 관리의 메모리 사용량 레이아웃 섹션에 설명된 일반적인 메모리 레이아웃을 참조하세요.
최대 메모리 크기를 설정할 때 균형을 찾습니다. 최대 메모리 크기를 너무 높게 설정하면 컨테이너 OOM의 위험이 있습니다. 최대 메모리 크기를 너무 낮게 설정하면 JVM OOM의 위험이 있으며 가비지 수집으로 인해 앱 속도가 느려집니다.
힙 메모리 제어
-Xms
, -Xmx
. -XX:InitialRAMPercentage
및 -XX:MaxRAMPercentage
JVM 옵션을 사용하여 최대 힙 크기를 설정할 수 있습니다.
jvm.memory.used
의 값이 메트릭에서 너무 높은 경우 최대 힙 크기 설정을 조정해야 할 수 있습니다. 자세한 내용은 메모리 문제를 해결하기 위한 도구의 jvm.memory.used/committed/max 섹션을 참조하세요.
직접 메모리 제어
다음과 같은 이유로 -XX:MaxDirectMemorySize
JVM 옵션을 설정하는 것이 중요합니다.
- nio 및 gzip과 같은 프레임워크에서 직접 메모리를 사용하는 경우는 알 수 없습니다.
- 직접 메모리의 가비지 수집은 전체 가비지 수집 중에만 처리되며, 전체 가비지 수집은 힙이 거의 가득 찬 경우에만 발생합니다.
일반적으로 앱 메모리 크기에서 힙 메모리를 뺀 비힙 메모리 값보다 작은 값으로 MaxDirectMemorySize
를 설정할 수 있습니다.
메타스페이스 제어
-XX:MaxMetaspaceSize
JVM 옵션을 설정하여 최대 메타스페이스 크기를 설정할 수 있습니다. -XX:MetaspaceSize
옵션은 임계값을 설정하여 전체 가비지 수집을 트리거합니다.
메타스페이스 메모리는 일반적으로 안정적입니다.