Udostępnij za pośrednictwem


Wydajne korzystanie z pamięci dla aplikacji Java w usłudze Azure Container Apps

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ć aplikację maksymalną ilość 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łączanie montażu 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ć dopasowywanie pamięci podczas tworzenia aplikacji kontenera, ustaw zmienną środowiskową BP_JVM_FIT na falsewartość .

W poniższych przykładach pokazano, jak używać wyłączania dopasowania pamięci za pomocą createpoleceń , upi 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

Automatyczne wyłączanie

Dopasowanie pamięci jest automatycznie wyłączone po spełnieniu dowolnego 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 jest automatycznie wyłączone, jeśli określisz maksymalny rozmiar sterty w zmiennej środowiskowej, jak pokazano w poniższym przykładzie:

    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 dopasowania pamięci w dzienniku są wyświetlane następujące dane wyjściowe komunikatu:

    Wyłączenie montażu pamięci jvm, przyczyna: użyj ustawień określonych w JAVA_TOOL_OPTIONS=-Xmx512m zamiast tego Odebrano JAVA_TOOL_OPTIONS: -Xmx512m

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

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

Sprawdź strumień dziennika podczas uruchamiania komunikatu, który odwołuje się do obliczeniowej konfiguracji pamięci JVM.

Oto przykładowe dane wyjściowe komunikatu podczas uruchamiania.

Obliczana konfiguracja pamięci JVM: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M (łączna ilość pamięci: 2G, liczba wątków: 250, liczba załadowanych klas: 12924, pokój główny: 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 kontener 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 1200M jest większa niż 1G dostępna dla alokacji (-Xmx1200M)

Następne kroki