---
title: "Go 1.25 e o Coletor de Lixo \"Chá Verde\": Uma Nova Abordagem para Performance"
url: "https://golang.com.br/blog/go-1-25-coletor-lixo-green-tea/"
markdown_url: "https://golang.com.br/blog/go-1-25-coletor-lixo-green-tea.MD"
description: "O Green Tea GC do Go 1.25 reduz ate 40% do tempo de garbage collection. Saiba como ativar com GOEXPERIMENT=greenteagc e os resultados em producao no Google."
date: "2025-10-29"
author: "Go Blog (Resumo)"
---

# Go 1.25 e o Coletor de Lixo "Chá Verde": Uma Nova Abordagem para Performance

O Green Tea GC do Go 1.25 reduz ate 40% do tempo de garbage collection. Saiba como ativar com GOEXPERIMENT=greenteagc e os resultados em producao no Google.


O Go 1.25 introduziu um novo coletor de lixo (garbage collector - GC) experimental, apelidado de "Green Tea" (Chá Verde), que promete melhorias significativas na performance de diversas aplicações. Ativado através da flag `GOEXPERIMENT=greenteagc` durante a compilação, o Green Tea GC já demonstra reduções de até 40% no tempo gasto com coleta de lixo em alguns cenários, com uma média de 10% de melhora. O coletor já está em uso no Google, o que indica sua prontidão para produção. A equipe Go incentiva a comunidade a testá-lo e reportar resultados, positivos ou negativos, para ajudar a aprimorar a implementação. A expectativa é que o Green Tea se torne o coletor de lixo padrão no Go 1.26.

### Coleta de Lixo Tracing: O Básico

Para entender as melhorias do Green Tea, é importante revisitar os fundamentos da coleta de lixo tracing, utilizada pelo Go.

#### Objetos e Ponteiros

O coletor de lixo do Go gerencia automaticamente a memória alocada para *objetos* no heap. Um objeto é qualquer valor Go cuja memória subjacente é alocada no heap. Isso geralmente acontece quando o compilador Go não consegue determinar um tempo de vida estático para o valor, necessitando alocação dinâmica.

*Ponteiros* são simplesmente endereços de memória que permitem o acesso a esses objetos. Eles são a forma como o programa Go referencia os objetos alocados no heap.

#### O Algoritmo Mark-Sweep

O Go utiliza um algoritmo de coleta de lixo chamado *mark-sweep* (marcação e varredura). Este algoritmo opera em duas fases principais:

1.  **Marcação (Mark):** O coletor percorre o grafo de objetos, começando pelas *raízes* (variáveis globais e locais), e marca todos os objetos alcançáveis como "visitados". Esse processo é análogo a um algoritmo de busca em grafos, como busca em profundidade ou largura.

2.  **Varredura (Sweep):** Após a marcação, o coletor examina todos os objetos no heap. Aqueles que *não* foram marcados como visitados são considerados *inalcançáveis* (unreachable), ou seja, não estão mais sendo utilizados pelo programa. A memória ocupada por esses objetos é então liberada para ser reutilizada pelo alocador de memória.

Embora a descrição acima seja simplificada, ela captura a essência do algoritmo. O coletor de lixo do Go executa esse processo concorrentemente com a execução do programa principal, e também paraleliza o algoritmo para melhorar a performance.

#### Exemplo do Algoritmo Mark-Sweep

Imagine um grafo de objetos onde os nós são os objetos e as arestas são os ponteiros. O processo de marcação começa nas raízes (variáveis globais) e segue os ponteiros para marcar todos os objetos alcançáveis. Após a marcação, todos os objetos não marcados são considerados lixo e sua memória é liberada.

### O Problema com a Abordagem Tradicional

O coletor de lixo tradicional do Go, embora eficiente, pode apresentar gargalos em certas situações. Um dos principais problemas é a necessidade de *synchronization* (sincronização) entre as goroutines que estão modificando o grafo de objetos e as goroutines do coletor de lixo que estão percorrendo esse mesmo grafo. Essa sincronização pode levar a *pauses* (pausas) na execução do programa, afetando a latência.

### Green Tea: Uma Nova Arquitetura de Coleta de Lixo

O Green Tea GC introduz uma arquitetura inovadora que visa reduzir a necessidade de sincronização e, consequentemente, diminuir as pausas. A principal mudança é a introdução de um modelo de *ownership* (propriedade) mais explícito para os objetos no heap.

#### Ownership e Mutabilidade

No modelo tradicional, o coletor de lixo precisa assumir que qualquer objeto pode ser modificado a qualquer momento por qualquer goroutine. Isso exige um mecanismo de sincronização robusto para garantir a consistência dos dados durante a coleta.

O Green Tea GC introduz o conceito de *ownership*. Cada objeto é considerado "owned" (possuído) por uma única goroutine em um dado momento. Apenas a goroutine que possui o objeto tem permissão para modificá-lo. Isso elimina a necessidade de sincronização em muitos casos, pois o coletor de lixo pode ter a garantia de que o objeto não será modificado enquanto estiver sendo examinado.

#### Implementação Prática

A implementação do Green Tea GC envolve várias otimizações:

*   **Write Barriers Otimizados:** O *write barrier* é um pequeno trecho de código executado sempre que um ponteiro é modificado. Sua função é informar o coletor de lixo sobre a modificação, para que ele possa rastrear corretamente as dependências entre os objetos. O Green Tea GC utiliza write barriers mais eficientes, reduzindo o overhead.
*   **Coleta Concorrente Aprimorada:** O Green Tea GC é projetado para ser altamente concorrente, permitindo que a coleta de lixo ocorra em paralelo com a execução do programa principal, minimizando as pausas.
*   **Detecção de Ciclos Otimizada:** A detecção de ciclos (grupos de objetos que referenciam uns aos outros, mas não são mais alcançáveis pelas raízes) é uma parte importante da coleta de lixo. O Green Tea GC utiliza algoritmos otimizados para detectar e remover ciclos de forma eficiente.
*   **Redução da Fragmentação:** O Green Tea GC também inclui melhorias no alocador de memória para reduzir a fragmentação do heap, o que pode melhorar a performance geral do programa.

#### Benefícios Práticos

Os benefícios do Green Tea GC se traduzem em:

*   **Menos Pausas:** A redução da necessidade de sincronização leva a pausas mais curtas e menos frequentes, melhorando a latência das aplicações.
*   **Menor Uso de CPU:** Os write barriers otimizados e a coleta concorrente mais eficiente reduzem o overhead da coleta de lixo, liberando recursos da CPU para outras tarefas.
*   **Melhor Escalabilidade:** A arquitetura do Green Tea GC é projetada para escalar bem em sistemas com muitos cores e goroutines.

### Como Testar o Green Tea GC

Para experimentar o Green Tea GC, você precisa compilar seu programa Go com a flag `GOEXPERIMENT=greenteagc`:

```bash
go build -gcflags="-gcflags=-d=gctrace=1" -ldflags="-X main.useGreenteaGC=true" -tags=greenteagc main.go
```

Após a compilação, execute o programa e observe os logs do coletor de lixo (ativados através da flag `-gcflags=-d=gctrace=1`). Compare o tempo gasto com a coleta de lixo com e sem o Green Tea GC para avaliar o impacto na performance da sua aplicação.

### Implicações e Próximos Passos

O Green Tea GC representa um avanço significativo na tecnologia de coleta de lixo do Go. Ao introduzir um modelo de ownership mais explícito e otimizar a concorrência, o Green Tea GC promete melhorar a performance e a escalabilidade de diversas aplicações Go.

A equipe Go incentiva a comunidade a testar o Green Tea GC, reportar resultados e contribuir para o desenvolvimento futuro dessa tecnologia. A expectativa é que o Green Tea GC se torne o coletor de lixo padrão no Go 1.26, beneficiando todos os usuários da linguagem.

---

## Artigo Original

Este e um resumo em portugues do artigo original publicado no blog oficial do Go.

**Titulo original:** The Green Tea Garbage Collector

[Leia o artigo completo em ingles no Go Blog](https://go.dev/blog/greenteagc)

*Autor original: Michael Knyszek and Austin Clements*
