← Voltar para o blog

Green Tea: O Novo Garbage Collector do Go

Go 1.25 traz o Green Tea, um novo garbage collector experimental que reduz overhead em até 40%. Entenda como funciona.

O Go 1.25 inclui um novo garbage collector experimental chamado Green Tea, disponível configurando GOEXPERIMENT=greenteagc no momento do build.

Muitos workloads gastam cerca de 10% menos tempo no garbage collector, mas alguns veem reduções de até 40%!

Já está em uso no Google em produção, então encorajamos você a testar. Baseado nos dados que temos agora, planejamos torná-lo o padrão no Go 1.26.

Como Funciona o Garbage Collection

O propósito do garbage collection é recuperar e reutilizar automaticamente memória que não está mais sendo usada pelo programa.

Objetos e Ponteiros

No contexto do runtime Go:

  • Objetos são valores Go cuja memória é alocada no heap
  • Ponteiros são números que indicam a localização de um valor Go na memória

Por exemplo, o código abaixo aloca um único objeto no heap:

var x = make([]*int, 10) // global

O Algoritmo Mark-Sweep

O garbage collector do Go implementa o algoritmo mark-sweep, que opera em duas fases:

  1. Fase Mark: Caminha pelo grafo de objetos a partir das raízes (variáveis globais e locais), marcando tudo que encontra como visitado.

  2. Fase Sweep: Itera por todos os objetos não visitados e marca sua memória como livre para reutilização.

É essencialmente um algoritmo de flood em grafo, como uma busca em profundidade ou largura.

O Que Há de Novo no Green Tea

O Green Tea traz melhorias significativas:

  • Redução de 10-40% no overhead do GC para muitos workloads
  • Algoritmo novo projetado para as capacidades do hardware atual
  • No Go 1.26, redução adicional de 10% em hardware com instruções AVX-512

Como Testar

# Build com Green Tea habilitado
GOEXPERIMENT=greenteagc go build ./...

# Rodar aplicação
./minha-app

Reportando Feedback

Conclusão

O Green Tea representa um avanço significativo no garbage collector do Go, oferecendo melhorias substanciais de performance sem exigir mudanças no código. Com o plano de torná-lo padrão no Go 1.26, os usuários precisarão apenas atualizar a versão do Go para se beneficiar.


Traduzido e adaptado do Go Blog, baseado na palestra de Michael Knyszek na GopherCon 2025.