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).
Go utiliza um modelo de garbage collector baseado em marcação e varredura (mark-and-sweep). Esse modelo de algoritmo funciona em duas fases principais:
- Fase de Marcação (Mark): O GC percorre todas as referências de objetos ativos na memória, começando de um ponto de entrada (como variáveis globais e pilhas de execução). Todo objeto alcançável é marcado como “em uso” ou “ativo”.
- Fase de Varredura (Sweep): Após a marcação, o GC varre a memória, identificando os objetos que não foram marcados como ativos. Esses objetos são considerados “inacessíveis” e têm sua memória liberada, tornando-a disponível para reutilização.
Este método é eficiente para garantir que a memória utilizada por objetos não mais referenciados seja liberada. O algoritmo é simples de implementar e evita vazamentos de memória, mas pode ter desvantagens como pausas prolongadas (stop-the-world) para realizar a coleta, especialmente em programas maiores ou mais complexos.
Para tentar contornar esse problema de performance, a partir da versão 1.5 do Go, o GC se tornou concurrent (sendo executado em paralelo com o código da aplicação), o que significa que o GC tenta minimizar as pausas (stop-the-world) para recolher o lixo, proporcionando melhor desempenho.
Garbage Collector em ação
A ação do Garbage Collector em Go ocorre principalmente em dois cenários:
- Alocação de memória: Toda vez que uma nova variável ou objeto é criado, o Go aloca memória para ele. Quando o GC identifica que não há mais referências a esses objetos, ele os coleta e libera a memória.
- Fragmentação de memória: O GC é responsável por garantir que a memória fragmentada seja recuperada e reutilizada. Caso contrário, a aplicação poderia acabar com pouca memória livre, mesmo quando o total de memória alocada não está sendo utilizado.
Embora o Garbage Collector faça grande parte do trabalho pesado, existem cenários em que o comportamento do código pode fazer com que objetos permaneçam na memória por mais tempo do que o necessário.
Como esse assunto é extenso e depende de um conhecimento interno um pouco mais avançado, abordarei os cenários envolvendo map e slice nos próximos 2 posts. Dessa forma, poderei explicar com mais clareza e sem deixar um post muito extenso.
Conclusão
O Garbage Collector do Go é um aliado poderoso na gestão automática de memória, permitindo que desenvolvedores se concentrem em outros aspectos da aplicação. No entanto, é importante entender seus limites e as armadilhas comuns que podem causar vazamentos de memória. Ao conhecer esses detalhes, você pode escrever código mais eficiente e evitar que problemas de memória afetem o desempenho da sua aplicação Go.
Para saber mais detalhes, assina a nossa newsletter e não perca os próximos posts.
Até!
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.
Livros Recomendados
Abaixo listei alguns dos melhores livros que já li sobre GO.





[…] Para entender um pouco melhor o funcionamento do GC, recomendo a leitura do post “Como funciona o Garbage Collector do Go” […]
[…] Como funciona o Garbage Collector do Go […]