Usare la memoria in modo efficiente per le app Java nelle App contenitore di Azure (anteprima)
Java Virtual Machine (JVM) usa la memoria in modo conservativo perché presuppone che la memoria del sistema operativo debba essere condivisa tra più applicazioni. L'app contenitore può tuttavia ottimizzare l'utilizzo della memoria e rendere disponibile per l'applicazione la quantità massima di memoria possibile. Questa ottimizzazione della memoria è nota come adattamento automatico della memoria Java. Quando l'adattamento della memoria è abilitato, le prestazioni dell'applicazione Java riscontrano in genere un miglioramento compreso tra il 10% e il 20% senza modifiche al codice.
La piattaforma App contenitore di Azure offre l'adattamento automatico della memoria nelle circostanze seguenti:
- Una singola applicazione Java è in esecuzione in un contenitore.
- L'applicazione viene distribuita dal codice sorgente o da un file JAR.
L'adattamento automatico della memoria è abilitato per impostazione predefinita, ma è possibile disabilitarlo manualmente.
Disabilitare l'adattamento della memoria
L'adattamento automatico della memoria è utile nella maggior parte degli scenari, ma potrebbe non essere ideale per tutte le situazioni. È possibile disabilitare l'adattamento della memoria manualmente o automaticamente.
Disabilitazione manuale
Per disabilitare l'adattamento della memoria quando si crea l'app contenitore, impostare la variabile di ambiente BP_JVM_FIT
su false
.
Gli esempi seguenti illustrano come disabilitare l'adattamento della memoria con i comandi create
, up
e 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"
Per verificare che l'adattamento della memoria sia disabilitato, controllare se nei log è presente il messaggio seguente:
Disabling jvm memory fitting, reason: manually disabled
Disabilitazione automatica
L'adattamento della memoria viene disabilitato automaticamente quando vengono soddisfatte le condizioni seguenti:
Memoria del contenitore limitata: la memoria del contenitore è inferiore a 1 GB.
Opzioni di memoria impostate in modo esplicito: quando una o più impostazioni di memoria vengono specificate nelle variabili di ambiente tramite
JAVA_TOOL_OPTIONS
. Le opzioni di impostazione della memoria includono i valori seguenti:-XX:MaxRAMPercentage
-XX:MinRAMPercentage
-XX:InitialRAMPercentage
-XX:MaxMetaspaceSize
-XX:MetaspaceSize
-XX:ReservedCodeCacheSize
-XX:MaxDirectMemorySize
-Xmx
-Xms
-Xss
Ad esempio, l'adattamento della memoria viene disabilitato automaticamente se si specificano le dimensioni massime dell'heap in una variabile di ambiente, come illustrato nell'esempio seguente:
az containerapp update \ --name <CONTAINER_APP_NAME> \ --resource-group <RESOURCE_GROUP> \ --image <CONTAINER_IMAGE_LOCATION> \ --set-env-vars JAVA_TOOL_OPTIONS="-Xmx512m"
Con l'adattamento della memoria disabilitato, viene visualizzato l'output del messaggio seguente nel log:
Disabling jvm memory fitting, reason: use settings specified in JAVA_TOOL_OPTIONS=-Xmx512m instead Picked up JAVA_TOOL_OPTIONS: -Xmx512m
Dimensioni di memoria non heap ridotte: rari casi in cui le dimensioni calcolate dell'heap o del non heap sono troppo piccole (minori di 200 MB).
Verificare che l'adattamento della memoria sia abilitato
Esaminare il flusso di log durante l'avvio per individuare un messaggio che fa riferimento a Configurazione di memoria JVM calcolata.
Di seguito è riportato un esempio di output del messaggio durante l'avvio.
Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M (Total Memory: 2G, Thread Count: 250, Loaded Class Count: 12924, Headroom: 0%)
Picked up JAVA_TOOL_OPTIONS: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M
Configurazione del runtime
È possibile impostare le variabili di ambiente per influire sul comportamento di adattamento della memoria.
Variabile | Unità | Esempio | Descrizione |
---|---|---|---|
BPL_JVM_HEAD_ROOM |
Percentuale | BPL_JVM_HEAD_ROOM=5 |
Consente di lasciare spazio di memoria per il sistema in base alla percentuale specificata. |
BPL_JVM_THREAD_COUNT |
Numero | BPL_JVM_THREAD_COUNT=200 |
Numero massimo stimato di thread. |
BPL_JVM_CLASS_ADJUSTMENT |
Numero Percentuale |
BPL_JVM_CLASS_ADJUSTMENT=10000 BPL_JVM_CLASS_ADJUSTMENT="10%" |
Consente di modificare il numero di classi JVM in base al valore esplicito o alla percentuale. |
Nota
La modifica di queste variabili non disabilita l'adattamento automatico della memoria.
Avviso di memoria insufficiente
Se si decide di configurare manualmente le impostazioni di memoria, si rischia di riscontrare un avviso di memoria insufficiente.
Ecco alcuni possibili motivi per cui il contenitore potrebbe esaurire la memoria:
La memoria heap è maggiore della memoria totale disponibile.
La memoria non heap è maggiore della memoria totale disponibile.
La somma di memoria heap e non heap è maggiore della memoria totale disponibile.
Se il contenitore esaurisce la memoria, viene visualizzato l'avviso seguente:
Avviso OOM: memoria heap 1200M maggiore di 1 G disponibile per l'allocazione (-Xmx1200M)