Sdílet prostřednictvím


Efektivní využití paměti pro aplikace v Javě v Azure Container Apps

Virtuální počítač Java (JVM) používá paměť konzervativně, protože předpokládá, že paměť operačního systému musí být sdílena mezi více aplikacemi. Vaše aplikace kontejneru ale může optimalizovat využití paměti a zpřístupnit pro vaši aplikaci maximální velikost paměti. Tato optimalizace paměti se označuje jako automatické přizpůsobení paměti v Javě. Pokud je povolené přizpůsobení paměti, výkon aplikace v Javě se obvykle vylepšuje mezi 10 % a 20 % bez jakýchkoli změn kódu.

Azure Container Apps poskytuje automatické přizpůsobení paměti za následujících okolností:

  • V kontejneru běží jedna aplikace v Javě.
  • Vaše aplikace se nasadí ze zdrojového kódu nebo souboru JAR.

Automatické přizpůsobení paměti je ve výchozím nastavení povolené, ale můžete ho zakázat ručně.

Zakažte přizpůsobení paměti.

Automatické přizpůsobení paměti je užitečné ve většině scénářů, ale nemusí být ideální pro všechny situace. Přizpůsobení paměti můžete vypnout ručně nebo automaticky.

Ruční zakázání

Pokud chcete při vytváření aplikace kontejneru zakázat přizpůsobení paměti, nastavte proměnnou BP_JVM_FIT prostředí na falsehodnotu .

Následující příklady ukazují, jak pomocí příkazu , upa update příkazy zakázat přizpůsobení createpaměti.

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

Pokud chcete ověřit, že je instalace paměti zakázaná, zkontrolujte v protokolech následující zprávu:

Zakázání fitování paměti jvm, důvod: ruční zakázání

Automatické zakázání

Pokud jsou splněny některé z následujících podmínek, je při splnění některé z následujících podmínek automaticky zakázáno přizpůsobení paměti:

  • Omezená paměť kontejneru: Paměť kontejneru je menší než 1 GB.

  • Explicitně nastavit možnosti paměti: Pokud je jedno nebo více nastavení paměti zadáno v proměnných prostředí prostřednictvím JAVA_TOOL_OPTIONS. Možnosti nastavení paměti zahrnují následující hodnoty:

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

    Pokud například zadáte maximální velikost haldy v proměnné prostředí, jak je znázorněno v následujícím příkladu, je přizpůsobení paměti automaticky zakázáno:

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

    Při zakázaném zapadající paměti se do protokolu zobrazí následující výstup zprávy:

    Zakázání přizpůsobení paměti jvm, důvod: použijte nastavení zadaná v JAVA_TOOL_OPTIONS=-Xmx512m místo toho vyzvednuta JAVA_TOOL_OPTIONS: -Xmx512m

  • Malá velikost paměti bez haldy: Vzácné případy, kdy je počítaná velikost haldy nebo neheap příliš malá (menší než 200 MB).

Ověření povolení přizpůsobení paměti

Zkontrolujte stream protokolu během spouštění a vyhledejte zprávu, která odkazuje na konfiguraci paměti počítaný JVM.

Tady je příklad výstupu zprávy během spuštění.

Vypočítaná konfigurace paměti JVM: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M (celková paměť: 2G, počet vláken: 250, načtený počet tříd: 12924, hlavní místnost: 0 %)

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

Konfigurace modulu runtime

Proměnné prostředí můžete nastavit tak, aby ovlivnily chování přizpůsobení paměti.

Proměnná Unit Příklad Popis
BPL_JVM_HEAD_ROOM Procento BPL_JVM_HEAD_ROOM=5 Nechte paměťový prostor pro systém na základě daného procenta.
BPL_JVM_THREAD_COUNT Počet BPL_JVM_THREAD_COUNT=200 Odhadovaný maximální počet vláken.
BPL_JVM_CLASS_ADJUSTMENT Počet
Procento
BPL_JVM_CLASS_ADJUSTMENT=10000
BPL_JVM_CLASS_ADJUSTMENT="10%"
Upravte počet tříd JVM podle explicitní hodnoty nebo procenta.

Poznámka:

Změna těchto proměnných nezakazuje automatické přizpůsobení paměti.

Upozornění na nedostatek paměti

Pokud se rozhodnete nakonfigurovat nastavení paměti sami, riskujete, že dojde k upozornění na nedostatek paměti.

Tady je několik možných důvodů, proč by kontejneru mohlo docházet k nedostatku paměti:

  • Paměť haldy je větší než celková dostupná paměť.

  • Paměť bezheapu je větší než celková dostupná paměť.

  • Halda + paměť bezheapu je větší než celková dostupná paměť.

Pokud váš kontejner vyčerpá paměť, zobrazí se následující upozornění:

Upozornění OOM: Paměť haldy 1200M je větší než 1G k dispozici pro přidělení (-Xmx1200M)

Další kroky