Partilhar via


Usar a memória de forma eficiente para aplicativos Java em Aplicativos de Contêiner do Azure (visualização)

A Java Virtual Machine (JVM) usa a memória de forma conservadora, pois pressupõe que a memória do sistema operacional deve ser compartilhada entre vários aplicativos. No entanto, seu aplicativo de contêiner pode otimizar o uso de memória e disponibilizar o máximo de memória possível para seu aplicativo. Essa otimização de memória é conhecida como ajuste automático de memória Java. Quando o ajuste de memória está ativado, o desempenho do aplicativo Java normalmente é melhorado entre 10% e 20% sem alterações no código.

Os Aplicativos de Contêiner do Azure fornecem ajuste automático de memória nas seguintes circunstâncias:

  • Um único aplicativo Java está sendo executado em um contêiner.
  • Seu aplicativo é implantado a partir do código-fonte ou de um arquivo JAR.

O ajuste automático de memória está ativado por padrão, mas você pode desativar manualmente.

Desativar o ajuste de memória

O ajuste automático de memória é útil na maioria dos cenários, mas pode não ser ideal para todas as situações. Você pode desativar o ajuste de memória manual ou automaticamente.

Desativação manual

Para desabilitar o ajuste de memória ao criar seu aplicativo de contêiner, defina a variável BP_JVM_FIT de ambiente como false.

Os exemplos a seguir mostram como usar desabilitar o ajuste de memória com os createcomandos , upe .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" 

Para verificar se o ajuste de memória está desativado, verifique os logs para a seguinte mensagem:

Desativando o ajuste de memória jvm, motivo: desativado manualmente

Desativação automática

O ajuste de memória é desativado automaticamente quando qualquer uma das seguintes condições é atendida:

  • Memória de contêiner limitada: a memória de contêiner é inferior a 1 GB.

  • Opções de memória definidas explicitamente: quando uma ou mais configurações de memória são especificadas em variáveis de ambiente através do JAVA_TOOL_OPTIONS. As opções de configuração de memória incluem os seguintes valores:

    • -XX:MaxRAMPercentage
    • -XX:MinRAMPercentage
    • -XX:InitialRAMPercentage
    • -XX:MaxMetaspaceSize
    • -XX:MetaspaceSize
    • -XX:ReservedCodeCacheSize
    • -XX:MaxDirectMemorySize
    • -Xmx
    • -Xms
    • -Xss

    Por exemplo, o ajuste de memória é automaticamente desativado se você especificar o tamanho máximo de heap em uma variável de ambiente, como mostrado no exemplo a seguir:

    az containerapp update \
      --name <CONTAINER_APP_NAME> \
      --resource-group <RESOURCE_GROUP> \
      --image <CONTAINER_IMAGE_LOCATION>  \
      --set-env-vars JAVA_TOOL_OPTIONS="-Xmx512m" 
    

    Com o ajuste de memória desativado, você verá a seguinte saída de mensagem para o log:

    Desativando o ajuste de memória jvm, motivo: use as configurações especificadas em JAVA_TOOL_OPTIONS=-Xmx512m em vez disso Pegou JAVA_TOOL_OPTIONS: -Xmx512m

  • Tamanho de memória pequeno não heap: Casos raros em que o tamanho calculado de heap ou nonheap size é muito pequeno (menos de 200 MB).

Verifique se o ajuste de memória está ativado

Inspecione seu fluxo de log durante a inicialização para obter uma mensagem que faça referência à Configuração de Memória JVM Calculada.

Eis um exemplo de saída de mensagem durante o arranque.

Configuração de memória JVM calculada: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M (Memória total: 2G, Contagem de threads: 250, Contagem de classes carregadas: 12924, Headroom: 0%)

Pegou JAVA_TOOL_OPTIONS: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M

Configuração de tempo de execução

Você pode definir variáveis de ambiente para afetar o comportamento de ajuste de memória.

Variável Unit Exemplo Description
BPL_JVM_HEAD_ROOM Percentagem BPL_JVM_HEAD_ROOM=5 Deixe espaço de memória para o sistema com base na porcentagem dada.
BPL_JVM_THREAD_COUNT Número BPL_JVM_THREAD_COUNT=200 O número máximo estimado de threads.
BPL_JVM_CLASS_ADJUSTMENT Número
Percentagem
BPL_JVM_CLASS_ADJUSTMENT=10000
BPL_JVM_CLASS_ADJUSTMENT="10%"
Ajuste a contagem de classes JVM por valor explícito ou porcentagem.

Nota

A alteração dessas variáveis não desativa o ajuste automático da memória.

Aviso de falta de memória

Se você decidir definir as configurações de memória por conta própria, corre o risco de encontrar um aviso de falta de memória.

Aqui estão algumas possíveis razões pelas quais seu contêiner pode ficar sem memória:

  • A memória de pilha é maior do que a memória total disponível.

  • A memória não heap é maior do que a memória total disponível.

  • A memória heap + nonheap é maior do que a memória total disponível.

Se o contêiner ficar sem memória, você encontrará o seguinte aviso:

Aviso OOM: memória de pilha 1200M é maior que 1G disponível para alocação (-Xmx1200M)

Próximos passos