Java 애플리케이션 컨테이너화

이 문서에서는 Java 애플리케이션을 컨테이너화하기 위한 권장 전략 및 설정에 대한 개요를 제공합니다. Java 애플리케이션을 컨테이너화할 때 컨테이너를 사용할 수 있는 CPU 시간을 신중하게 고려합니다. 그런 다음 총 메모리 양과 Java JVM(Virtual Machine)의 힙 크기 모두에서 사용 가능한 메모리 양을 고려합니다. 컨테이너화된 환경에서 애플리케이션은 모든 프로세서에 액세스할 수 있으므로 여러 스레드를 병렬로 실행할 수 있습니다. 그러나 컨테이너에는 CPU에 대한 액세스를 제한할 수 있는 CPU 할당량이 적용된 것이 일반적입니다.

JVM은 추론을 사용하여 CPU 할당량에 따라 "사용 가능한 프로세서" 수를 결정하며, 이는 Java 애플리케이션의 성능에 크게 영향을 줄 수 있습니다. 컨테이너 자체에 할당된 메모리와 JVM에 대한 힙 영역의 크기는 프로세서만큼 중요합니다. 이러한 요인은 GC(가비지 수집기)의 동작과 시스템의 전반적인 성능을 결정합니다.

팁 (조언)

이러한 설정을 직접 조정하지 않으려면 Java Azure 명령 시작 관리자(jaz)가 자동으로 클라우드 네이티브 JVM 기본값을 적용합니다. 컨테이너 제한을 검색하고 가장 적합한 힙 크기 조정 및 GC 플래그를 선택하는 명령에 대한 java 드롭인 대체입니다. 자세한 내용은 Java Azure 명령 시작 관리자를 사용하여 JVM 자동 조정을 참조하세요.

새 애플리케이션 컨테이너화

새 애플리케이션에 대한 Java 워크로드를 컨테이너화할 때 메모리를 고려할 때 다음 두 가지를 고려합니다.

  • 컨테이너 자체에 할당된 메모리입니다.
  • Java 프로세스에 사용할 수 있는 메모리 양입니다.

JVM 기본 인체 공학 이해

애플리케이션에는 시작점 및 설정이 필요합니다. JVM에는 사용 가능한 프로세서 수와 시스템의 메모리 양을 기반으로 미리 정의된 값이 있는 기본 인체 공학이 있습니다. JVM은 특정 시작 플래그 또는 매개 변수 없이 시작할 때 다음 표에 표시된 기본값을 사용합니다.

다음 표에서는 사용 가능한 리소스에 대한 기본 GC를 보여 줍니다.

사용 가능한 리소스 기본 GC
모든 수의 프로세서
최대 1,791MB의 메모리
SerialGC
2개 이상의 프로세서
1,792MB 이상의 메모리
G1GC

다음 표에서는 JVM이 실행되는 환경에서 사용할 수 있는 메모리 양에 따라 기본 최대 힙 크기를 보여 줍니다.

사용 가능한 메모리 기본 최대 힙 크기
최대 256MB 50%의 사용 가능한 메모리
256MB ~512MB ~127MB
512MB 이상 사용 가능한 메모리: 25%

기본 초기 힙 크기는 사용 가능한 메모리의 1/64입니다. 이러한 값은 OpenJDK 11 이상 및 OpenJDK의 Microsoft Build, Azul Zulu, Eclipse Temurin, Oracle OpenJDK 등을 비롯한 대부분의 배포에 유효합니다.

컨테이너 메모리 확인

애플리케이션의 요구 사항 및 고유한 사용 패턴에 따라 워크로드에 가장 적합한 컨테이너 메모리 양을 선택합니다. 예를 들어 애플리케이션이 큰 개체 그래프를 만드는 경우 작은 개체 그래프가 많은 애플리케이션에 필요한 것보다 더 많은 메모리가 필요할 수 있습니다.

팁 (조언)

할당할 메모리의 양을 모르는 경우 좋은 시작점은 4GB입니다.

JVM 힙 메모리 확인

JVM 힙 메모리를 할당할 때 JVM에는 JVM 힙에 할당하는 양보다 더 많은 메모리가 필요합니다. 최대 JVM 힙 메모리를 컨테이너 메모리 양과 동일하게 설정하지 마세요. 이 설정으로 인해 컨테이너 OOM(메모리 부족) 오류 및 컨테이너 크래시가 발생할 수 있습니다.

팁 (조언)

JVM 힙에 75% 컨테이너 메모리를 할당합니다.

OpenJDK 11 이상에서는 다음 방법 중 하나로 JVM 힙 크기를 설정합니다.

설명 깃발 예시
고정 값 -Xmx -Xmx4g
동적 값 -XX:MaxRAMPercentage -XX:MaxRAMPercentage=75

최소 또는 초기 힙 크기

환경이 컨테이너와 같이 JVM 인스턴스에 예약된 특정 양의 메모리를 보장하는 경우 최소 힙 크기 또는 초기 힙 크기를 최대 힙 크기와 동일한 크기로 설정합니다. 이 설정은 메모리를 OS로 해제하는 작업을 수행해서는 안 되었음을 JVM에 나타냅니다.

최소 힙 크기를 설정하려면 절대 크기에는 -Xms을, 백분율 양에는 -XX:InitialRAMPercentage을 사용합니다.

중요합니다

이름에서 알 수 있듯이 플래그 -XX:MinRAMPercentage 는 시스템에서 최대 256MB의 RAM을 사용할 수 있는 시스템의 기본 최대 RAM 비율을 설정합니다.

OpenJDK 17의 기본 힙 크기를 보여 주는 차트입니다.

사용할 GC를 결정합니다

이전에는 시작할 JVM 힙 메모리의 양을 결정했습니다. 다음 단계는 GC를 선택하는 것입니다. 최대 JVM 힙 메모리의 양은 종종 선택한 GC에 영향을 줍니다. 다음 표에서는 각 GC의 특징을 설명합니다.

요소 SerialGC ParallelGC G1GC ZGC ShenandoahGC
코어 수 1 2 2 2 2
다중 스레드 아니오
Java 힙 크기 <4gb <4gb >4gb >4gb >4gb
일시 중지 예(<1ms) 예(<10ms)
오버헤드 미니멀한 미니멀한 보통 보통 보통
테일 대기 시간 효과 높음 높음 높음 낮음 보통
JDK 버전 모두 모두 JDK 8 이상 JDK 17 이상 JDK 11 이상
가장 적합한 단일 코어 힙 (작은 크기) 멀티코어 소형 힙 또는 힙 크기와 관계없는 일괄 처리 워크로드 대량의 데이터에서의 응답성(요청-응답/DB 상호 작용) 대량의 데이터에서의 응답성(요청-응답/DB 상호 작용) 대량의 데이터에서의 응답성(요청-응답/DB 상호 작용)

팁 (조언)

대부분의 범용 마이크로 서비스 애플리케이션의 경우 병렬 GC로 시작합니다.

필요한 CPU 코어 수 결정

SerialGC 이외의 GC의 경우 vCPU 코어를 2개 이상 사용하거나, Kubernetes에서는 2000m에 최소 cpu_limit를 사용하세요. 컨테이너화된 환경에서 vCPU 코어를 하나만 선택하지 마세요.

팁 (조언)

시작할 코어 수를 모르는 경우 두 개의 vCPU 코어를 선택하는 것이 좋습니다.

시작점 선택

Kubernetes, OpenShift, Azure Spring Apps, Azure Container Apps 및 Azure App Service 같은 컨테이너 오케스트레이션 환경에서 두 개의 복제본 또는 인스턴스로 시작합니다. 다음 표에서는 새 Java 애플리케이션의 컨테이너화에 권장되는 시작점을 요약합니다.

vCPU 코어 컨테이너 메모리 JVM 힙 크기 GC 복제본
2 4GB 75% ParallelGC 2

다음 JVM 매개 변수를 사용합니다.

-XX:+UseParallelGC -XX:MaxRAMPercentage=75

Java Azure 명령 시작 관리자를 사용하여 JVM을 자동으로 조정합니다.

이전 섹션에서는 컨테이너 메모리, CPU 코어 및 워크로드 유형에 따라 수동으로 JVM 플래그를 선택하는 방법을 설명합니다. 이러한 설정을 직접 유지하지 않으려면 Java Azure 명령 시작 관리자(jaz)가 클라우드 네이티브 JVM 기본값을 자동으로 적용합니다.

Java Azure 명령 시작 관리자가 시작 명령과 JVM 사이에 있는 경량 유틸리티입니다. 컨테이너 메모리 및 CPU 제한을 포함한 클라우드 환경을 검색한 다음 힙 크기 조정, GC 선택 및 진단에 가장 적합한 튜닝 플래그를 선택합니다. 이 방법은 구성 오버헤드를 줄이고 리소스 사용률을 개선합니다.

도구를 사용하려면 실행 스크립트 또는 Dockerfile에서 java 명령을 jaz로 바꾸세요. 예를 들어 JVM 옵션을 수동으로 튜닝하는 대신 다음을 수행합니다.

java -XX:+UseParallelGC -XX:MaxRAMPercentage=75 -jar myapp.jar

jaz는 다음 용도로 사용합니다.

jaz -jar myapp.jar

도구는 OpenJDK의 Microsoft Build 컨테이너 이미지에 포함되므로 추가 설정이 필요하지 않습니다. 다음 Dockerfile은 jaz를 사용하여 jar 파일에서 Java 애플리케이션을 실행합니다:

# Use any Microsoft Build of OpenJDK base image
FROM mcr.microsoft.com/openjdk/jdk:25-ubuntu

# Add your application.jar
COPY application.jar /application.jar

# Use jaz to launch your Java application
CMD ["jaz", "-jar", "application.jar"]

설치 옵션, 지원되는 환경 및 구성 세부 정보는 Java Azure 명령 시작 관리자를 참조하세요.

기존 온-프레미스 애플리케이션 컨테이너화

애플리케이션이 온-프레미스 또는 클라우드의 VM에서 이미 실행 중인 경우 다음 구성으로 시작합니다.

  • 애플리케이션이 현재 액세스할 수 있는 메모리 양과 동일합니다.
  • 애플리케이션에서 현재 사용할 수 있는 CPU 또는 vCPU 코어의 수와 동일합니다.
  • 현재 사용하는 것과 동일한 JVM 매개 변수입니다.

vCPU 코어 또는 컨테이너 메모리 조합을 사용할 수 없는 경우 가장 가까운 코어를 선택하여 vCPU 코어와 컨테이너 메모리를 반올림합니다.

다음 단계

이제 Java 애플리케이션 컨테이너화에 대한 일반적인 권장 사항을 이해했으므로 다음 문서를 계속 진행하여 컨테이너화 기준을 설정하고 JVM 튜닝을 간소화합니다.