Entendendo o Green Tea GC do Go 1.26

Go 1.26 trouxe uma das maiores mudanças no runtime dos últimos anos: o Green Tea garbage collector agora vem habilitado por padrão. Nesse post, vamos entender o que mudou, por que isso importa e o que esperar na prática.

O que é o Green Tea GC?

O Green Tea GC é uma reformulação do garbage collector do Go. Ele mantém a mesma abordagem mark-sweep do GC anterior, mas muda fundamentalmente a forma como os objetos são rastreados e escaneados.

A diferença principal: em vez de operar objeto por objeto espalhado pelo heap, o Green Tea trabalha no nível de páginas de memória. Ele agrupa objetos em blocos contíguos de 8 KiB chamados spans e escaneia vários objetos de uma vez dentro do mesmo span.

Como funciona na prática

O foco está em objetos pequenos — até 512 bytes — que são os mais comuns e os mais custosos para escanear individualmente.

Quando o GC encontra um objeto que precisa ser escaneado, ele não faz isso imediatamente. Em vez disso, marca a posição do objeto dentro do seu span e espera até acumular vários objetos no mesmo span. Quando processa o span, escaneia todos de uma vez.

Essa abordagem melhora a localidade de cache de forma significativa: acessar memória contígua é muito mais rápido do que pular entre endereços espalhados pelo heap.

Distribuição de trabalho entre cores

O GC anterior usava uma fila global para distribuir trabalho entre goroutines. Isso criava contenção quando vários cores tentavam acessar a fila ao mesmo tempo.

O Green Tea resolve isso com filas locais por worker. Cada worker tem sua própria fila de spans para processar. Quando um worker fica ocioso, ele “rouba” tarefas de outros workers — um padrão conhecido como work stealing. Isso elimina o gargalo central e escala melhor com mais cores.

Resultados de performance

Os números são animadores:

  • 10% a 40% de redução no overhead do GC em programas reais com uso intensivo de coleta
  • ~10% adicional em plataformas AMD64 modernas, graças ao uso de instruções vetoriais (AVX-256 e AVX-512) para acelerar o escaneamento de objetos pequenos

Isso não é benchmark sintético — são ganhos observados em aplicações de produção.

O trade-off: mais memória residente

Nem tudo são flores. Benchmarks iniciais mostram um aumento de 8% a 15% no RSS (Resident Set Size). Esse é o custo da estratégia de escaneamento por spans: manter mais metadados por página consome mais memória base.

Para a maioria das aplicações, esse trade-off vale a pena. Mas se o seu caso exige o menor footprint de memória possível, vale monitorar.

Como desabilitar

Se precisar voltar ao GC anterior, basta compilar com:

GOEXPERIMENT=nogreenteagc go build ./...

Mas a recomendação é testar com o Green Tea habilitado primeiro — os ganhos são reais para a maioria dos cenários.

Relação com outras otimizações do Go 1.26

O Green Tea GC complementa a alocação especulativa na stack que já estava disponível desde o Go 1.25. Enquanto a alocação na stack reduz a quantidade de objetos que chegam ao heap, o Green Tea melhora a eficiência de coleta dos objetos que inevitavelmente vão parar lá.

Combinadas, essas duas otimizações atacam o problema de performance do GC por dois ângulos: menos lixo para coletar e coleta mais rápida do lixo restante.

Conclusão

O Green Tea GC é o tipo de melhoria que demonstra a maturidade do runtime do Go. Sem mudar a API, sem quebrar compatibilidade, o time do Go entregou ganhos significativos de performance que você obtém simplesmente atualizando o toolchain.

Se você já está no Go 1.26, o Green Tea já está trabalhando por você. Se ainda não atualizou, esse é mais um bom motivo.

Gostou do conteúdo?

  • Inscreva-se na newsletter para receber mais dicas práticas sobre Go diretamente no seu e-mail!
  • 🚀 Conheça a Imersão Golang e leve seus conhecimentos em Go para o próximo nível!

Faça parte da comunidade!

Receba os melhores conteúdos sobre Go, Kubernetes, arquitetura de software, Cloud e esteja sempre atualizado com as tendências e práticas do mercado.

* indicates required

Deixe uma resposta