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. **