Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save gbzarelli/7996424d114392551205722363925a97 to your computer and use it in GitHub Desktop.
Save gbzarelli/7996424d114392551205722363925a97 to your computer and use it in GitHub Desktop.
Comparação dos Principais Garbage Collectors da JVM #helpdev-blog

Comparação dos Principais Garbage Collectors da JVM

Garbage Collector Compactação e Fragmentação STW (Stop-The-World) Uso recomendado Estrutura da Heap Processos do GC Trade-offs Recursos Recomendados Outros detalhes
Serial GC Compacta após Major GC
Pode sofrer fragmentação antes da compactação
🔴 Alto (pausa total na coleta). Aplicações pequenas com pouca alocação de memória. Young Gen (Eden + Survivor) + Old Gen Mark → Sweep → Compact Baixo consumo de memória
STW muito longo
🔹 1 CPU Core
🔹 ≤ 1GB RAM
Usa uma única thread, causando longas pausas.
Parallel GC Compacta após Major GC ou Full GC
Pode sofrer fragmentação antes da compactação
🔴 Alto (mas usa múltiplas threads para coletar mais rápido). Aplicações com alto throughput, sem preocupação com latência. Young Gen (Eden + Survivor) + Old Gen Mark → Sweep → Compact (paralelizado) Melhor para alto throughput
Pausas longas devido ao STW
🔹 2+ CPU Cores
🔹 ≥ 2GB RAM
Usa múltiplas threads, melhor que Serial, mas ainda gera pausas longas.
G1 GC (Padrão) 🔄 Compactação parcial conforme necessário
Evita fragmentação movendo regiões vivas
🟠 Moderado (pausas curtas e previsíveis). Aplicações com heap médio a grande, que precisam de latência equilibrada. Heap dividida em regiões (Young, Old, Humongous, Free, etc.) Incremental Mark → Copy → Evacuation Pause → Mixed GC → Compact (quando necessário) Menores pausas e melhor previsibilidade do STW
Melhor para heaps médios e grandes
Consome mais CPU que Parallel GC
Overhead maior devido à coleta incremental
🔹 2+ CPU Cores
🔹 ≥ 2GB RAM
GC Padrão desde Java 9.
ZGC Não compacta
Evita fragmentação usando ponteiros remapáveis
🟢 Baixo (STW quase imperceptível). Aplicações de baixa latência e heaps muito grandes. Heap unificada (sem Young/Old Gen) Concurrent Mark → Concurrent Relocate → Concurrent Remap STW quase zero, escala para grandes heaps
Maior consumo de CPU e RAM
🔹 4+ CPU Cores (funciona, mas não ideal)
🔹 ≥ 4GB RAM (funciona, mas não ideal)
🔹 8+ CPU Cores recomendado
🔹 ≥ 8GB RAM recomendado
Heap até 16TB, coleta totalmente concurrente.
Generational ZGC (GenZGC) Não compacta
Evita fragmentação separando Young/Old Gen
🟢 Baixo (pausas ainda menores que ZGC). Aplicações de baixa latência e alto throughput, otimizando a coleta de objetos jovens. Heap segmentada em Young e Old Gen, otimizada para coleta jovem Concurrent Mark → Concurrent Young Collection → Concurrent Old Relocate → Concurrent Remap Maior throughput e menor latência
Melhor eficiência na coleta jovem
Maior consumo de memória para gerenciar Young/Old Gen
🔹 4+ CPU Cores (funciona, mas não ideal)
🔹 ≥ 4GB RAM (funciona, mas não ideal)
🔹 8+ CPU Cores recomendado
🔹 ≥ 8GB RAM recomendado
Introduzido no Java 21, melhora eficiência do ZGC.

**### 📌 Observações

  • ZGC e GenZGC podem funcionar com 4 núcleos e 4GB de RAM, mas seu desempenho ideal é obtido com 8+ núcleos e 8GB+ de RAM.
  • G1 GC é o GC padrão para a maioria das aplicações modernas, sendo um equilíbrio entre throughput e latência.
  • Parallel GC ainda é uma boa opção para aplicações que priorizam throughput puro.
  • Se sua aplicação for sensível a pausas, ZGC ou GenZGC são as melhores opções, desde que os recursos do sistema sejam suficientes. **
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment