Udostępnij za pośrednictwem


Wydajne używanie pamięci dla aplikacji Java w usłudze Azure Container Apps (wersja zapoznawcza)

Maszyna wirtualna Java (JVM) używa pamięci konserwatywnie, ponieważ zakłada, że pamięć systemu operacyjnego musi być współdzielona między wieloma aplikacjami. Jednak aplikacja kontenera może zoptymalizować użycie pamięci i udostępnić aplikacji maksymalną ilość możliwej pamięci. Ta optymalizacja pamięci jest znana jako automatyczne dopasowywanie pamięci w języku Java. Po włączeniu dopasowania pamięci wydajność aplikacji Java jest zwykle większa w zakresie od 10% do 20% bez żadnych zmian w kodzie.

Usługa Azure Container Apps zapewnia automatyczne dopasowywanie pamięci w następujących okolicznościach:

  • Jedna aplikacja Java działa w kontenerze.
  • Aplikacja jest wdrażana z kodu źródłowego lub pliku JAR.

Automatyczne dopasowywanie pamięci jest domyślnie włączone, ale można je wyłączyć ręcznie.

Wyłącz dopasowywanie pamięci

Automatyczne dopasowywanie pamięci jest przydatne w większości scenariuszy, ale może nie być idealne dla wszystkich sytuacji. Można wyłączyć ręczne lub automatyczne dopasowywanie pamięci.

Wyłączanie ręczne

Aby wyłączyć alokację pamięci podczas tworzenia aplikacji kontenera, ustaw zmienną środowiskową BP_JVM_FIT na false.

W poniższych przykładach pokazano, jak wyłączyć dopasowanie pamięci przy użyciu poleceń create, up i 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" 

Aby sprawdzić, czy dopasowanie pamięci jest wyłączone, sprawdź dzienniki pod kątem następującego komunikatu:

Wyłączenie montażu pamięci jvm, przyczyna: ręcznie wyłączone

Automatyczna dezaktywacja

Automatyczne dopasowanie konfiguracji pamięci jest wyłączane, gdy zostanie spełniony dowolny z następujących warunków:

  • Ograniczona pamięć kontenera: pamięć kontenera jest mniejsza niż 1 GB.

  • Jawne ustawianie opcji pamięci: jeśli co najmniej jedno ustawienie pamięci jest określone w zmiennych środowiskowych za pośrednictwem programu JAVA_TOOL_OPTIONS. Opcje ustawienia pamięci obejmują następujące wartości:

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

    Na przykład dopasowanie pamięci RAM jest automatycznie wyłączone, jeśli określisz maksymalny rozmiar stosu w zmiennej środowiskowej, jak pokazano w przykładzie poniżej:

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

    Po wyłączeniu funkcji dopasowania pamięci w dzienniku jest wyświetlany następujący komunikat:

    Wyłączenie dopasowania pamięci jvm, powód: użyj ustawień podanych w JAVA_TOOL_OPTIONS=-Xmx512m zamiast tego Zastosowano JAVA_TOOL_OPTIONS: -Xmx512m

  • Mały rozmiar pamięci poza stertą: Rzadkie przypadki, gdy obliczony rozmiar sterty lub rozmiar pamięci poza stertą jest za mały (mniej niż 200 MB).

Sprawdzanie, czy dopasowanie pamięci jest włączone

Przejrzyj strumień dziennika podczas uruchamiania w poszukiwaniu komunikatu, który odnosi się do kalkulacji pamięci JVM.

Oto przykładowy komunikat podczas uruchamiania.

Obliczona konfiguracja pamięci JVM: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M (Całkowita ilość pamięci: 2G, liczba wątków: 250, liczba załadowanych klas: 12924, zapas miejsca: 0%)

Odebrano JAVA_TOOL_OPTIONS: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M

Konfiguracja środowiska uruchomieniowego

Zmienne środowiskowe można ustawić tak, aby wpływały na zachowanie dopasowania pamięci.

Zmienna Jednostka Przykład opis
BPL_JVM_HEAD_ROOM Procent BPL_JVM_HEAD_ROOM=5 Pozostaw miejsce na pamięć dla systemu na podstawie podanej wartości procentowej.
BPL_JVM_THREAD_COUNT Liczba BPL_JVM_THREAD_COUNT=200 Szacowana maksymalna liczba wątków.
BPL_JVM_CLASS_ADJUSTMENT Liczba
Procent
BPL_JVM_CLASS_ADJUSTMENT=10000
BPL_JVM_CLASS_ADJUSTMENT="10%"
Dostosuj liczbę klas JVM według jawnej wartości lub wartości procentowej.

Uwaga

Zmiana tych zmiennych nie powoduje wyłączenia automatycznego dopasowania pamięci.

Ostrzeżenie o braku pamięci

Jeśli zdecydujesz się samodzielnie skonfigurować ustawienia pamięci, wystąpi ryzyko wystąpienia ostrzeżenia o braku pamięci.

Oto kilka możliwych powodów, dla których kontenerowi może zabraknąć pamięci:

  • Pamięć stertowa jest większa niż łączna ilość dostępnej pamięci.

  • Pamięć niezwiązana z stosem jest większa niż łączna ilość dostępnej pamięci.

  • Pamięć sterta i niezwiązana z stertą jest większa niż łączna ilość dostępnej pamięci.

Jeśli w kontenerze zabraknie pamięci, zostanie wyświetlone następujące ostrzeżenie:

Ostrzeżenie OOM: pamięć sterty 1200 MB jest większa niż 1 GB dostępna dla alokacji (-Xmx1200M)

Następne kroki