Opções comuns de ajuste da JVM
Opções de heap, GC e JIT.
Opções comuns de ajuste da JVM é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
Por que ajustar a JVM?
A JVM tem padrões sensatos, mas, para serviços exigentes, às vezes você ajusta o tamanho da memória dinâmica, o coletor de lixo e o comportamento da compilação em tempo de execução.
O ajuste é a última etapa: analise primeiro, corrija o código e só então recorra às opções quando as medições justificarem isso.
Tamanho da memória dinâmica: -Xms e -Xmx
As duas opções mais comuns definem os limites da memória dinâmica:
-Xms— tamanho inicial da memória dinâmica.-Xmx— tamanho máximo da memória dinâmica.
Exemplo: java -Xms512m -Xmx2g MyApp. Definir -Xms com o mesmo valor de -Xmx evita pausas de redimensionamento em servidores de longa duração.
Lendo os padrões
Você pode perguntar à JVM o que ela escolheu. Runtime expõe os valores atuais da memória dinâmica, e -XX:+PrintFlagsFinal exibe o valor efetivo de cada opção.
O exemplo imprime os limites de memória da JVM em execução.
public class Main {
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();
long mb = 1024 * 1024;
System.out.println("Max heap (Xmx): " + (rt.maxMemory() / mb) + " MB");
System.out.println("Total heap now: " + (rt.totalMemory() / mb) + " MB");
System.out.println("Free in heap: " + (rt.freeMemory() / mb) + " MB");
System.out.println("Available cores: " + rt.availableProcessors());
}
}Escolhendo um coletor
JDK modernos oferecem vários coletores de lixo:
-XX:+UseG1GC— o padrão; equilibrado e baseado em regiões.-XX:+UseZGC— pausas ultracurtas, memórias dinâmicas grandes.-XX:+UseParallelGC— máxima taxa de transferência, pausas mais longas.-XX:+UseSerialGC— uma única linha de execução, aplicativos e contêineres pequenos.
Meta de pausa do G1
G1 é um coletor orientado ao tempo de pausa. Você fornece uma meta, e ele tenta cumpri-la:
-XX:MaxGCPauseMillis=200solicita que o G1 mantenha as pausas próximas de 200 ms.
É uma meta flexível, não uma garantia. Defini-la baixa demais força coletas pequenas e frequentes, o que pode prejudicar a taxa de transferência.
ZGC para baixa latência
Quando os tempos de pausa precisam permanecer abaixo de um milissegundo, mesmo em memórias dinâmicas de vários gigabytes, use ZGC com -XX:+UseZGC.
Ele realiza a maior parte do trabalho simultaneamente às linhas de execução do aplicativo. A contrapartida é uma sobrecarga adicional de CPU e memória em comparação com G1. É ideal para serviços sensíveis à latência.
Registro da coleta de lixo
Para ajustar a coleta de lixo, você precisa observá-la. Ative o registro unificado:
-Xlog:gc*:file=gc.log:time,uptime,level,tags
Isso registra cada coleta com marcas de tempo e durações. Envie o registro a um visualizador (ou ao JMC/JFR) para identificar pausas longas ou frequentes antes de alterar qualquer opção.
Contêineres e CPU
Dentro de contêineres, a JVM lê os limites dos grupos de controle. Por padrão, ela usa uma fração do limite de memória para a memória dinâmica.
-XX:MaxRAMPercentage=75.0define a memória dinâmica como uma porcentagem da memória do contêiner.-XX:ActiveProcessorCount=Nsubstitui a quantidade de CPU detectada.
Isso evita alocar mais memória do que o limite permite, o que faria o orquestrador encerrar o processo.
Sinalizadores de JIT e diagnóstico
Mais alguns sinalizadores úteis:
-XX:+HeapDumpOnOutOfMemoryError— despeja a memória dinâmica em caso de OOM para análise posterior.-XX:HeapDumpPath=/tmp— define onde gravá-lo.-XX:+PrintCompilation— permite acompanhar a atividade de compilação JIT.
Eles têm baixo custo e são muito úteis quando algo dá errado.
Disciplina de ajuste
Regras de ouro para os sinalizadores:
- Altere um sinalizador por vez e faça uma nova medição comparando-a com uma referência.
- Não copie sinalizadores cegamente de publicações em blogs — elas podem ter como alvo uma JVM antiga.
- A maioria dos aplicativos precisa apenas de
-Xmxe, talvez, da escolha de um coletor; os valores padrão são bons.
Espaço de metadados e linhas de execução
A memória dinâmica não é a única região de memória:
-XX:MaxMetaspaceSizelimita o espaço de metadados das classes; sem ele, um vazamento durante o carregamento de classes pode esgotar a memória nativa.-Xssdefine o tamanho da pilha de cada linha de execução; reduza-o se executar muitas linhas de execução, e aumente-o para recursões profundas.
Raramente é necessário ajustar esses valores, mas saber que eles existem ajuda quando o problema está na memória nativa, e não na memória dinâmica.
Verificação rápida
O que os sinalizadores -Xms e -Xmx controlam?
Recapitulação
Os sinalizadores que vale a pena conhecer:
-Xms/-Xmxdelimitam a memória dinâmica.- Escolha um coletor: G1 (padrão), ZGC (pausas curtas), Paralelo (rendimento).
- Defina
-XX:MaxGCPauseMillispara o G1; ative-Xlog:gc*para acompanhar o comportamento. - Use
MaxRAMPercentageem contêineres eHeapDumpOnOutOfMemoryErrorcomo medida de segurança. - Altere um sinalizador por vez e faça medições.
Perguntas Frequentes
A aula “Opções comuns de ajuste da JVM” é grátis?
Sim — o texto completo de “Opções comuns de ajuste da JVM” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “Opções comuns de ajuste da JVM”?
Opções de heap, GC e JIT. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Opções comuns de ajuste da JVM”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Identificando gargalos
- Java Flight Recorder
- Analisando com o JDK Mission Control
- Opções comuns de ajuste da JVM