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 create
comandos , 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á 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)