다음을 통해 공유


Azure Container Apps에서 Java 앱에 대한 메모리를 효율적으로 사용(미리 보기)

JVM(Java Virtual Machine)은 OS 메모리가 여러 애플리케이션에서 공유되어야 한다고 가정하므로 메모리를 보수적으로 사용합니다. 하지만 컨테이너 앱은 메모리 사용을 최적화하고 애플리케이션에서 사용할 수 있는 최대 메모리 양을 확보할 수 있습니다. 이러한 메모리 최적화는 Java 자동 메모리 피팅이라고 합니다. 메모리 피팅을 사용하도록 설정하면 코드를 변경하지 않고도 Java 애플리케이션 성능이 일반적으로 10~20% 개선됩니다.

Azure Container Apps는 다음과 같은 상황에서 자동 메모리 피팅을 제공합니다.

  • 단일 Java 애플리케이션이 컨테이너에서 실행됩니다.
  • 사용자의 애플리케이션은 소스 코드나 JAR 파일에서 배포됩니다.

자동 메모리 피팅은 기본적으로 사용하도록 설정되어 있지만 수동으로 사용하지 않도록 설정할 수 있습니다.

메모리 피팅 사용 안 함

자동 메모리 피팅은 대부분의 경우에 도움이 되지만, 어떤 경우에는 적합하지는 않을 수 있습니다. 메모리 피팅을 수동이나 자동으로 사용하지 않도록 설정할 수 있습니다.

수동 사용 안 함

컨테이너 앱을 만들 때 메모리 피팅을 사용하지 않도록 설정하려면 환경 변수 BP_JVM_FITfalse로 설정합니다.

다음 예에서는 create, up, update 명령을 사용하여 메모리 피팅을 사용하지 않도록 설정하는 방법을 보여 줍니다.

az containerapp create \
  --name <CONTAINER_APP_NAME> \
  --resource-group <RESOURCE_GROUP> \
  --image <CONTAINER_IMAGE_LOCATION> \
  --environment <ENVIRONMENT_NAME> \
  --env-vars BP_JVM_FIT="false" 

메모리 피팅이 사용하지 않도록 설정되었는지 확인하려면 로그에서 다음 메시지를 확인합니다.

jvm 메모리 피팅 사용 안 함, 이유: 수동으로 사용 안 함

자동 사용 안 함

다음 조건 중 하나라도 충족되면 메모리 피팅이 자동으로 사용하지 않도록 설정됩니다.

  • 제한된 컨테이너 메모리: 컨테이너 메모리가 1GB 미만입니다.

  • 명시적으로 메모리 옵션 설정: JAVA_TOOL_OPTIONS를 통해 환경 변수에 하나 이상의 메모리 설정이 지정된 경우. 메모리 설정 옵션에는 다음 값이 포함됩니다.

    • -XX:MaxRAMPercentage
    • -XX:MinRAMPercentage
    • -XX:InitialRAMPercentage
    • -XX:MaxMetaspaceSize
    • -XX:MetaspaceSize
    • -XX:ReservedCodeCacheSize
    • -XX:MaxDirectMemorySize
    • -Xmx
    • -Xms
    • -Xss

    예를 들어, 다음 예와 같이 환경 변수에 최대 힙 크기를 지정하면 메모리 피팅이 자동으로 사용하지 않도록 설정됩니다.

    az containerapp update \
      --name <CONTAINER_APP_NAME> \
      --resource-group <RESOURCE_GROUP> \
      --image <CONTAINER_IMAGE_LOCATION>  \
      --set-env-vars JAVA_TOOL_OPTIONS="-Xmx512m" 
    

    메모리 피팅이 사용하지 않도록 설정되면 다음 메시지가 로그에 출력됩니다.

    jvm 메모리 피팅 사용 안 함, 이유: 대신 JAVA_TOOL_OPTIONS=-Xmx512m에 지정된 설정 사용, JAVA_TOOL_OPTIONS: -Xmx512m이 선택됨

  • 힙이 아닌 작은 메모리 크기: 계산된 힙 크기 또는 힙이 아닌 크기가 너무 작은(200MB 미만) 드문 경우.

메모리 피팅이 사용하도록 설정되어 있는지 확인

시작 중에 로그 스트림을 검사하여 계산된 JVM 메모리 구성을 참조하는 메시지를 확인합니다.

다음은 시작하는 동안 출력되는 메시지의 예입니다.

계산된 JVM 메모리 구성: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M(총 메모리: 2G, 스레드 수: 250, 로드된 클래스 수: 12924, 위쪽 공간: 0%)

JAVA_TOOL_OPTIONS: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M이 선택됨

런타임 구성

환경 변수를 설정하여 메모리 피팅 동작에 영향을 미칠 수 있습니다.

변수 단위 예제 설명
BPL_JVM_HEAD_ROOM 백분율 BPL_JVM_HEAD_ROOM=5 지정된 백분율에 따라 시스템에 메모리 공간을 그대로 둡니다.
BPL_JVM_THREAD_COUNT number BPL_JVM_THREAD_COUNT=200 예상되는 최대 스레드 수.
BPL_JVM_CLASS_ADJUSTMENT number
백분율
BPL_JVM_CLASS_ADJUSTMENT=10000
BPL_JVM_CLASS_ADJUSTMENT="10%"
명시적인 값이나 백분율로 JVM 클래스 수를 조정합니다.

참고 항목

이러한 변수를 변경해도 자동 메모리 피팅은 사용하지 않도록 설정되지 않습니다.

메모리 부족 경고

직접 메모리 설정을 구성하기로 결정하면 메모리 부족 경고가 발생할 위험이 있습니다.

컨테이너의 메모리가 부족해질 수 있는 몇 가지 이유는 다음과 같습니다.

  • 힙 메모리는 사용 가능한 총 메모리보다 큽니다.

  • 힙이 아닌 메모리는 사용 가능한 총 메모리보다 큽니다.

  • 힙 메모리 + 힙이 아닌 메모리가 사용 가능한 총 메모리보다 큽니다.

컨테이너의 메모리가 부족하면 다음과 같은 경고가 표시됩니다.

OOM 경고: 힙 메모리 1200M이 할당 가능한 1G보다 큼(-Xmx1200M)

다음 단계