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)