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
, up
och 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)