Share via


Problemas de reinicialização do aplicativo causados por problemas de falta de memória

Nota

Azure Spring Apps é o novo nome para o serviço Azure Spring Cloud. Embora o serviço tenha um novo nome, você verá o nome antigo em alguns lugares por um tempo enquanto trabalhamos para atualizar ativos, como capturas de tela, vídeos e diagramas.

Este artigo aplica-se a: ✔️ Basic/Standard ✔️ Enterprise

Este artigo descreve problemas de falta de memória (OOM) para aplicativos Java no Azure Spring Apps.

Tipos de problemas de falta de memória

Há dois tipos de problemas de falta de memória: OOM de contêiner e OMM da JVM.

  • O OOM de contêiner, também chamado de OOM do sistema, ocorre quando a memória do aplicativo disponível se esgotou. O problema OOM do contêiner causa eventos de reinicialização do aplicativo, que são relatados na seção Integridade do recurso do portal do Azure. Normalmente, o OOM do contêiner é causado por configurações incorretas de tamanho de memória.

  • JVM OOM ocorre quando a quantidade de memória usada atingiu o tamanho máximo definido nas opções da JVM. A JVM OOM não fará com que um aplicativo seja reiniciado. Normalmente, o OOM da JVM é resultado de um código incorreto, que você pode encontrar procurando java.lang.OutOfMemoryError exceções no log do aplicativo. A JVM OOM tem um efeito negativo sobre a aplicação e as ferramentas de criação de perfil Java, como o Java Flight Recorder.

Este artigo se concentra em como corrigir problemas de OOM de contêiner. Para corrigir problemas de OOM da JVM, verifique ferramentas como heap dump, thread dump e Java Flight Recorder. Para obter mais informações, consulte Capturar despejo de pilha e despejo de thread manualmente e usar o Java Flight Recorder no Azure Spring Apps.

Corrigir problemas de reinicialização do aplicativo devido ao OOM

As seções a seguir descrevem as ferramentas, métricas e opções da JVM que você pode usar para diagnosticar e corrigir problemas de OOM de contêiner.

Exibir alertas na página Integridade do recurso

A página Integridade do recurso no portal do Azure mostra eventos de reinicialização do aplicativo devido ao OOM do contêiner, conforme mostrado na captura de tela a seguir:

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

Configurar o tamanho da memória

As métricas Uso da memória do aplicativo, jvm.memory.usede jvm.memory.committed fornecem uma exibição do uso da memória. Para obter mais informações, consulte a seção Métricas de Ferramentas para solucionar problemas de memória. Configure os tamanhos máximos de memória nas opções da JVM para garantir que a memória esteja abaixo do limite.

A soma dos tamanhos máximos de memória de todas as partes no modelo de memória Java deve ser menor do que a memória real disponível do aplicativo. Para definir os tamanhos máximos de memória, consulte o layout de memória típico descrito na seção Layout de uso de memória do gerenciamento de memória Java.

Encontre um equilíbrio ao definir o tamanho máximo de memória. Quando você define o tamanho máximo de memória muito alto, há um risco de OOM de contêiner. Quando você define o tamanho máximo de memória muito baixo, há um risco de JVM OOM, e a coleta de lixo será de e diminuirá a velocidade do aplicativo.

Controlar a memória de pilha

Você pode definir o tamanho máximo da pilha usando as -Xmsopções , -Xmx, -XX:InitialRAMPercentagee -XX:MaxRAMPercentage JVM.

Talvez seja necessário ajustar as configurações de tamanho máximo de heap quando o valor de jvm.memory.used for muito alto nas métricas. Para obter mais informações, consulte a seção jvm.memory.used/committed/max de Ferramentas para solucionar problemas de memória.

Controle a memória direta

É importante definir a -XX:MaxDirectMemorySize opção JVM pelos seguintes motivos:

  • Você pode não perceber quando frameworks como nio e gzip usam memória direta.
  • A coleta de lixo de memória direta só é manipulada durante a coleta completa de lixo, e a coleta completa de lixo ocorre apenas quando a pilha está quase cheia.

Normalmente, você pode definir MaxDirectMemorySize como um valor menor do que o tamanho da memória do aplicativo menos a memória de pilha menos a memória não heap.

Controle o metaespaço

Você pode definir o tamanho máximo do metaespaço definindo a -XX:MaxMetaspaceSize opção JVM. A -XX:MetaspaceSize opção define o valor limite para acionar a coleta completa de lixo.

A memória do metaespaço é geralmente estável.

Consulte também