Compartilhar via


Usar a memória de forma eficiente para aplicativos Java nos Aplicativos de Contêiner do Azure (versão prévia)

A JVM (Máquina Virtual Java) 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 a quantidade máxima possível de memória para seu aplicativo. Essa otimização de memória é conhecida como ajuste automático de memória do Java. Quando o ajuste de memória está habilitado, o desempenho do aplicativo Java normalmente é melhorado entre 10% e 20% sem quaisquer alterações de 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á em execução 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 é habilitado por padrão, mas você pode desabilitá-lo manualmente.

Desabilitar 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 desabilitar o ajuste de memória manual ou automaticamente.

Desabilitar manualmente

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

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

Para verificar se o ajuste de memória está desabilitado, procure nos logs pela seguinte mensagem:

Desabilitando o ajuste de memória da jvm, motivo: desabilitado manualmente

Desabilitar automaticamente

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

  • Memória de contêiner limitada: a memória do 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 por meio de 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 será desabilitado automaticamente se você especificar o tamanho máximo de heap em uma variável de ambiente, como mostra o 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 desabilitado, você verá a seguinte saída de mensagem para o log:

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

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

Verificar se o ajuste de memória está habilitado

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

Aqui está um exemplo de saída de mensagem durante a inicialização.

Configuração Calculada de Memória da JVM: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M (Memória Total: 2G, Contagem de Threads: 250, Contagem de Classes Carregadas: 12924, Margem de Reserva: 0%)

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

Configuração de runtime

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

Variável Unidade Exemplo Descrição
BPL_JVM_HEAD_ROOM Percentual BPL_JVM_HEAD_ROOM=5 Deixe espaço de memória para o sistema com base na porcentagem fornecida.
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
Percentual
BPL_JVM_CLASS_ADJUSTMENT=10000
BPL_JVM_CLASS_ADJUSTMENT="10%"
Ajuste a contagem de classes da JVM por valor ou percentual explícitos.

Observação

Alterar essas variáveis não desabilita o ajuste automático de memória.

Aviso de memória insuficiente

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

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

  • A memória de heap é maior 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 + não heap é maior do que a memória total disponível.

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

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

Próximas etapas