Condividi tramite


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)

Passaggi successivi