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.

Leia mais »

Como Go 1.25 e 1.26 reduzem a pressão no GC

Nesse post, vamos entender uma das otimizações mais interessantes das últimas versões do Go: a capacidade do compilador de alocar slices na stack em mais cenários — sem você precisar mudar uma linha de código.

O problema: heap allocation e o GC

Em Go, cada variável precisa ser alocada em algum lugar: na stack (pilha) ou na heap. A stack é rápida — alocar e liberar memória lá é praticamente gratuito. Já a heap é gerenciada pelo garbage collector, o que tem um custo: quanto mais você aloca no heap, mais trabalho o GC tem para fazer.

O compilador do Go usa uma técnica chamada escape analysis para decidir onde cada variável vai parar. Se ele consegue provar que uma variável não vai “escapar” do escopo da função, ele a coloca na stack. Caso contrário, ela vai para o heap.

O problema é que essa análise é conservadora: em muitos casos práticos, como acumular elementos em um slice dentro de um loop, o compilador não tinha certeza se o slice ia escapar ou não e alocava no heap por precaução.

Leia mais »

Memory leaks em slices

Go é uma linguagem de programação reconhecida por sua eficiência e pelo gerenciamento automático de memória através do Garbage Collector (GC). No entanto, mesmo com essas vantagens, é possível que aplicações escritas em Go sofram de vazamentos de memória, especialmente quando se lida com slices de forma inadequada.

Neste post, exploraremos o que são memory leaks, como eles podem ocorrer em slices, e as melhores práticas para evitá-los.

O que é memory leak

Um memory leak (vazamento de memória) acontece quando um programa reserva espaço na memória para uso temporário e não o libera após o uso. Isso resulta em um consumo crescente de memória, podendo levar à degradação de desempenho ou até ao esgotamento da memória disponível, causando falhas na aplicação.

Em linguagens com gerenciamento automático de memória, como Go, o Garbage Collector é responsável por liberar a memória não utilizada. Porém, se houver referências ativas a áreas da memória que não são mais necessárias, o GC não consegue liberá-las, causando um vazamento de memória.

Leia mais »

Como funciona o Garbage Collector do Go

O Garbage Collector (GC) é um dos elementos cruciais da linguagem Go, pois foi projetado para simplificar a gestão de memória para desenvolvedores. Ao contrário de linguagens como C e C++, onde os programadores devem gerenciar a alocação e liberação de memória manualmente, o GC em Go automatiza esse processo.

Neste post, vamos explorar o funcionamento do Garbage Collector em Go, entender como ele age em diferentes cenários e identificar armadilhas que podem causar memory leaks mesmo com o GC em ação.

O que é Garbage Collector

O Garbage Collector é um mecanismo automático responsável por liberar a memória alocada para objetos que não estão mais sendo utilizados no programa. Em Go, ele atua identificando quais variáveis e estruturas de dados não são mais acessíveis ou referenciadas no código e, em seguida, liberando essa memória para que possa ser reutilizada. Isso melhora a eficiência da aplicação e evita problemas como vazamento de memória (memory leaks).

Leia mais »