Condividi tramite


Problemi di riavvio dell'app causati da problemi di memoria insufficiente

Nota

Azure Spring Apps è il nuovo nome del servizio Azure Spring Cloud. Anche se il servizio ha un nuovo nome, il nome precedente verrà visualizzato in alcune posizioni per un po' mentre si lavora per aggiornare gli asset, ad esempio screenshot, video e diagrammi.

Questo articolo si applica a: ✔️ Basic/Standard ✔️ Enterprise

Questo articolo descrive i problemi di memoria insufficiente per le applicazioni Java in Azure Spring Apps.

Tipi di problemi di memoria insufficiente

Esistono due tipi di problemi di memoria insufficiente: OOM del contenitore e OOM JVM.

  • L'OOM del contenitore, detto anche OOM di sistema, si verifica quando la memoria dell'app disponibile è esaurita. Il problema OOM del contenitore causa eventi di riavvio dell'app, segnalati nella sezione Integrità risorse del portale di Azure. In genere, l'OOM del contenitore è causato da configurazioni di dimensioni di memoria non corrette.

  • L'OOM di JVM si verifica quando la quantità di memoria usata ha raggiunto le dimensioni massime impostate nelle opzioni JVM. L'OOM JVM non causerà il riavvio di un'app. In genere, L'OOM di JVM è un risultato di codice non valido, che è possibile trovare cercando java.lang.OutOfMemoryError eccezioni nel log applicazioni. JVM OOM ha un effetto negativo sugli strumenti di profilatura Java e dell'applicazione, ad esempio Java Flight Recorder.

Questo articolo è incentrato su come risolvere i problemi relativi all'OOM del contenitore. Per risolvere i problemi di OOM di JVM, controllare strumenti come dump dell'heap, dump del thread e Java Flight Recorder. Per altre informazioni, vedere Acquisire manualmente dump dell'heap e dump del thread e usare Java Flight Recorder in Azure Spring Apps.

Risolvere i problemi di riavvio dell'app a causa dell'OOM

Le sezioni seguenti descrivono gli strumenti, le metriche e le opzioni JVM che è possibile usare per diagnosticare e risolvere i problemi relativi all'OOM del contenitore.

Visualizzare gli avvisi nella pagina Integrità risorse

La pagina Integrità risorse nella portale di Azure mostra gli eventi di riavvio dell'app a causa dell'OOM del contenitore, come illustrato nello screenshot seguente:

Screenshot of Azure portal showing Azure Spring Apps Resource Health page with OOM message highlighted.

Configurare le dimensioni della memoria

Le metriche Utilizzo memoria app, jvm.memory.usede jvm.memory.committed forniscono una visualizzazione dell'utilizzo della memoria. Per altre informazioni, vedere la sezione Metriche di Strumenti per risolvere i problemi di memoria. Configurare le dimensioni massime della memoria nelle opzioni JVM per assicurarsi che la memoria sia inferiore al limite.

La somma delle dimensioni massime della memoria di tutte le parti nel modello di memoria Java deve essere inferiore alla memoria dell'app disponibile reale. Per impostare le dimensioni massime della memoria, vedere il layout di memoria tipico descritto nella sezione Layout utilizzo memoria della gestione della memoria Java.

Trovare un saldo quando si impostano le dimensioni massime della memoria. Quando si impostano le dimensioni massime della memoria troppo elevate, esiste un rischio di OOM del contenitore. Quando si imposta la dimensione massima della memoria troppo bassa, si verifica un rischio di OOM JVM e garbage collection sarà di e rallenterà l'app.When you set the maximum memory size too low, there's a risk of JVM OOM, and garbage collection will be of and slow down the app.

Controllare la memoria dell'heap

È possibile impostare le dimensioni massime dell'heap usando le -Xmsopzioni , -Xmx-XX:InitialRAMPercentage, e -XX:MaxRAMPercentage JVM.

Potrebbe essere necessario modificare le impostazioni massime delle dimensioni dell'heap quando il valore di jvm.memory.used è troppo elevato nelle metriche. Per altre informazioni, vedere la sezione jvm.memory.used/committed/max di Strumenti per risolvere i problemi di memoria.

Controllare la memoria diretta

È importante impostare l'opzione -XX:MaxDirectMemorySize JVM per i motivi seguenti:

  • Non è possibile notare quando i framework, ad esempio nio e gzip, usano la memoria diretta.
  • La Garbage Collection della memoria diretta viene gestita solo durante la Garbage Collection completa e l'operazione di Garbage Collection completa si verifica solo quando l'heap è quasi pieno.

In genere, è possibile impostare MaxDirectMemorySize un valore minore delle dimensioni della memoria dell'app meno la memoria dell'heap meno la memoria non heap.

Metaspace di controllo

È possibile impostare la dimensione massima del metaspace impostando l'opzione -XX:MaxMetaspaceSize JVM. L'opzione -XX:MetaspaceSize imposta il valore soglia per attivare l'operazione completa di Garbage Collection.

La memoria metaspace è in genere stabile.

Vedi anche