Sobes.tech
Middle+

Fale sobre o coletor de lixo (garbage collector) na linguagem Go.

sobes.tech IA

Resposta da IA

O Go usa um recolhedor de lixo paralelo, de três cores, não compactador, com baixa latência.

Princípios básicos de funcionamento:

  • Marcação (Mark): Determina quais os objetos são acessíveis a partir dos ponteiros raiz (registos, pilhas de goroutines, variáveis globais). Utiliza um algoritmo de três cores (branco - não visitado, cinzento - visitado, mas os descendentes ainda não verificados, preto - visitado e todos os descendentes verificados).
  • Varredura (Sweep): Remove objetos inacessíveis (que permanecem brancos) e liberta memória para reutilização.

Características:

  • Paralelo: A marcação ocorre em paralelo com a execução do código do utilizador (as fases STW - Stop-The-World - são muito curtas).
  • Baixas latências: Projetado para minimizar as pausas na execução da aplicação.
  • Não compactador: Não move objetos vivos na memória, o que pode levar à fragmentação, mas simplifica a implementação e acelera a marcação/varredura.

Fases de trabalho:

  1. Assistência de marcação: As goroutines do utilizador ajudam o recolhedor na fase de marcação durante a alocação de memória.
  2. Marcação: Marcação paralela de objetos acessíveis.
  3. Finalização da marcação: Uma fase curta STW para finalizar a marcação.
  4. Varredura: Remoção paralela de objetos inacessíveis.

Gestão:

  • Automática.
  • Os limiares de ativação do recolhedor de lixo (GC trigger) são regulados pela variável de ambiente GOGC. Por padrão, GOGC=100, o que significa que a recolha começará quando o tamanho do monte duplicar em relação ao ciclo de recolha anterior.
  • A função runtime.GC() inicia forçosamente a recolha de lixo, mas o seu uso não é recomendado no código padrão.
package main

import (
	"runtime"
	"time"
)

func main() {
	// Exemplo de chamada forçada a GC (raramente necessário)
	runtime.GC()

	// Exemplo de obtenção de estatísticas de GC
	var memStats runtime.MemStats
	runtime.ReadMemStats(&memStats)
	// fmt.Printf("Memória total alocada: %v bytes\n", memStats.TotalAlloc)
}

Vantagens:

  • Gestão automática de memória, reduz a probabilidade de erros (fugas de memória, libertações duplas).
  • Projetado para execução concorrente.

Desvantagens:

  • Tempo de trabalho do GC não determinista.
  • Possível aumento no consumo de memória em comparação com a gestão manual.