7.1* Como escolher o coletor de lixo certo

Se seu aplicativo não tiver requisitos de latência rígidos, basta executar o aplicativo e deixar que a própria JVM escolha o coletor correto.

Na maioria dos casos, as configurações padrão funcionam bem. Se necessário, você pode ajustar o tamanho do heap para melhorar o desempenho. Se o desempenho ainda não for o esperado, tente modificar o coletor para atender aos requisitos do seu aplicativo.

  • Sequencial . Se o aplicativo tiver um pequeno conjunto de dados (até cerca de 100 MB) e/ou for executado em um único processador sem nenhum requisito de latência.
  • Paralelo . Se a prioridade for o desempenho máximo do aplicativo e não houver requisitos de latência (ou pausas de um segundo ou mais forem aceitáveis).
  • CMS/G1 . Se o tempo de resposta for mais importante do que a taxa de transferência geral, as pausas da coleta de lixo devem ser menores que um segundo.
  • ZGC . Se o tempo de resposta for de alta prioridade e/ou um heap muito grande estiver envolvido.

7.2* Recomendações para coleta de lixo

Evite acionamentos manuais

Além dos mecanismos básicos de coleta de lixo, um dos pontos mais importantes sobre esse processo em Java é que ele não é determinístico. Ou seja, é impossível prever quando exatamente em tempo de execução isso ocorrerá.

Usando os métodos System.gc() ou Runtime.gc(), você pode incluir uma dica em seu código para iniciar o coletor de lixo, mas isso não garante que ele realmente será executado.

Use ferramentas de análise

Se você não tiver memória suficiente para executar seu aplicativo, experimentará lentidão, longos tempos de coleta de lixo, eventos de "parada mundial" e, eventualmente, erros de falta de memória. Isso pode indicar que o heap é muito pequeno, mas também pode indicar que o aplicativo tem um vazamento de memória.

Você pode usar uma ferramenta de monitoramento como jstat ou Java Flight Recorder para ver se o uso do heap cresce indefinidamente, o que pode indicar um bug no código.

Prefira as configurações padrão

Se você tiver um aplicativo Java pequeno e independente, provavelmente não precisará configurar a coleta de lixo. As configurações padrão irão atendê-lo bem.

Use sinalizadores JVM para personalizar

A melhor abordagem para configurar a coleta de lixo em Java é definir sinalizadores JVM. Os sinalizadores podem ser usados ​​para definir o coletor de lixo (por exemplo, Serial, G1 e assim por diante), o tamanho inicial e máximo do heap, o tamanho das partições do heap (por exemplo, geração jovem, geração antiga) e muito mais. mais.

Escolha a torneira certa

Uma boa diretriz em termos de configurações iniciais é a natureza do aplicativo personalizado. Por exemplo, o coletor de lixo simultâneo é eficiente, mas geralmente gera eventos de “parada mundial”, tornando-o mais adequado para processamento interno em que longas pausas são aceitáveis.

Ao mesmo tempo, o coletor de lixo CMS foi projetado para minimizar a latência, o que o torna ideal para aplicativos da Web em que a capacidade de resposta é importante.