0Pricing
Java Academy · Aula

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=200 solicita 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.0 define a memória dinâmica como uma porcentagem da memória do contêiner.
  • -XX:ActiveProcessorCount=N substitui 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 -Xmx e, 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:MaxMetaspaceSize limita o espaço de metadados das classes; sem ele, um vazamento durante o carregamento de classes pode esgotar a memória nativa.
  • -Xss define 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 / -Xmx delimitam a memória dinâmica.
  • Escolha um coletor: G1 (padrão), ZGC (pausas curtas), Paralelo (rendimento).
  • Defina -XX:MaxGCPauseMillis para o G1; ative -Xlog:gc* para acompanhar o comportamento.
  • Use MaxRAMPercentage em contêineres e HeapDumpOnOutOfMemoryError como 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

  1. Identificando gargalos
  2. Java Flight Recorder
  3. Analisando com o JDK Mission Control
  4. Opções comuns de ajuste da JVM
← Voltar para Java Academy