Använda minne effektivt för Java-appar i Azure Container Apps (förhandsversion)

Den virtuella Java-datorn (JVM) använder minne konservativt eftersom det förutsätter att OS-minnet måste delas mellan flera program. Din containerapp kan dock optimera minnesanvändningen och göra den maximala mängden minne tillgängligt för ditt program. Den här minnesoptimeringen kallas automatisk minnesanpassning i Java. När minnesanpassning är aktiverat förbättras vanligtvis Java-programmets prestanda mellan 10 % och 20 % utan några kodändringar.

Azure Container Apps tillhandahåller automatisk minnesanpassning under följande omständigheter:

  • Ett enda Java-program körs i en container.
  • Programmet distribueras från källkoden eller en JAR-fil.

Automatisk minnesanpassning är aktiverat som standard, men du kan inaktivera manuellt.

Inaktivera minnesanpassning

Automatisk minnesanpassning är användbart i de flesta scenarier, men det kanske inte är idealiskt för alla situationer. Du kan inaktivera minnesanpassning manuellt eller automatiskt.

Inaktivera manuellt

Om du vill inaktivera minnesanpassning när du skapar containerappen anger du miljövariabeln BP_JVM_FIT till false.

I följande exempel visas hur du använder inaktivera minnesanpassning med kommandona create, upoch 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" 

Kontrollera att minnesanpassningen är inaktiverad genom att kontrollera att loggarna innehåller följande meddelande:

Inaktivera jvm-minnesanpassning, orsak: manuellt inaktiverad

Automatisk inaktivering

Minnesanpassning inaktiveras automatiskt när något av följande villkor uppfylls:

  • Begränsat containerminne: Containerminnet är mindre än 1 GB.

  • Ange uttryckligen minnesalternativ: När en eller flera minnesinställningar anges i miljövariabler via JAVA_TOOL_OPTIONS. Alternativen för minnesinställning innehåller följande värden:

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

    Minnesanpassning inaktiveras till exempel automatiskt om du anger den maximala heapstorleken i en miljövariabel som i följande exempel:

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

    När minnesanpassningen är inaktiverad visas följande meddelandeutdata i loggen:

    Inaktivera jvm-minnesanpassning, orsak: Använd inställningar som anges i JAVA_TOOL_OPTIONS=-Xmx512m i stället Hämtade JAVA_TOOL_OPTIONS: -Xmx512m

  • Liten minnesstorlek som inte är heap: Sällsynta fall när den beräknade storleken på heap- eller icke-heapstorleken är för liten (mindre än 200 MB).

Kontrollera att minnespassning är aktiverat

Granska loggströmmen under start för ett meddelande som refererar till beräknad JVM-minneskonfiguration.

Här är ett exempel på ett meddelandeutdata under start.

Beräknad JVM-minneskonfiguration: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M (totalt minne: 2G, Antal trådar: 250, Inläst klassantal: 12924, Utrymme: 0 %)

Upphämtad JAVA_TOOL_OPTIONS: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M

Körningskonfiguration

Du kan ange miljövariabler som påverkar minnesanpassningsbeteendet.

Olika Enhet Exempel beskrivning
BPL_JVM_HEAD_ROOM Procent BPL_JVM_HEAD_ROOM=5 Lämna minnesutrymmet för systemet baserat på den angivna procentandelen.
BPL_JVM_THREAD_COUNT Antal BPL_JVM_THREAD_COUNT=200 Det uppskattade maximala antalet trådar.
BPL_JVM_CLASS_ADJUSTMENT Antal
Procent
BPL_JVM_CLASS_ADJUSTMENT=10000
BPL_JVM_CLASS_ADJUSTMENT="10%"
Justera JVM-klassantalet efter explicit värde eller procentandel.

Kommentar

Om du ändrar dessa variabler inaktiveras inte automatisk minnesanpassning.

Varning om slut på minne

Om du bestämmer dig för att konfigurera minnesinställningarna själv riskerar du att stöta på en varning om slut på minne.

Här följer några möjliga orsaker till varför din container kan få slut på minne:

  • Heapminnet är större än det totala tillgängliga minnet.

  • Icke-högminnet är större än det totala tillgängliga minnet.

  • Heap + nonheap-minne är större än det totala tillgängliga minnet.

Om din container får slut på minne får du följande varning:

OOM-varning: heapminnet 1200M är större än 1 G tillgängligt för allokering (-Xmx1200M)

Nästa steg