0Pricing
Go Academy · Aula

Internals do coletor de lixo

Marcação e varredura tricolor, GOGC e pausas do GC

Internals do coletor de lixo é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.

Marcação e varredura tricolor

O GC do Go usa um algoritmo concorrente de marcação e varredura tricolor. Os objetos são brancos (não visitados), cinzentos (encontrados, mas com os filhos ainda não examinados) ou pretos (totalmente examinados). Os objetos brancos são lixo durante a varredura.

GC concorrente

O GC do Go é executado em grande parte em concorrência com as rotinas da aplicação. Isso reduz as pausas de parada total (STW) para durações inferiores a um milissegundo na maioria dos programas.

Barreira de escrita

Uma barreira de escrita intercepta as escritas de ponteiros durante a fase de marcação concorrente para manter a invariável de que objetos pretos não apontem para objetos brancos. Ela adiciona uma pequena sobrecarga a cada escrita de ponteiro.

Fases de STW

Duas pausas curtas de STW por ciclo de GC: (1) preparação da marcação (ativar a barreira de escrita, capturar instantâneos das pilhas das rotinas), (2) término da marcação (garantir que todos os objetos cinzentos sejam examinados). P99 normalmente é <1ms.

GOGC

O disparo do GC é controlado por GOGC (padrão 100). Isso significa "executar o GC quando o tamanho da memória dinâmica ativa dobrar em relação ao GC anterior". Definir GOGC=50 dispara o GC com mais frequência e usa menos memória; GOGC=200 dispara o GC com menos frequência e usa mais memória.

GOMEMLIMIT

GOMEMLIMIT (Go 1.19+) define um limite flexível de memória. Quando a memória dinâmica se aproxima do limite, o coletor de lixo é executado de forma mais agressiva, independentemente de GOGC. Use-o para evitar encerramentos por OOM em ambientes com memória limitada.

import "runtime/debug"
debug.SetMemoryLimit(512 * 1024 * 1024)

Ritmo

O coletor de lixo ajusta seu ritmo para concluir a marcação antes que a memória dinâmica se esgote em relação a GOGC. Se a taxa de alocação for alta, ele aumenta o número de gorrotinas que ajudam na marcação (auxílios de marcação).

runtime.GC()

Chamar runtime.GC() força um ciclo imediato do coletor de lixo. Isso é útil em testes para garantir que os finalizadores sejam executados ou em avaliações de desempenho para começar com a memória dinâmica limpa. Não o chame em produção.

Finalizadores

Registre uma função para ser executada quando um objeto for coletado pelo coletor de lixo com runtime.SetFinalizer. Os finalizadores são executados em uma gorrotina dedicada após a coleta de lixo. Evite usá-los para liberar recursos — use métodos Close() em vez disso.

Métricas do coletor de lixo

Leia as estatísticas do coletor de lixo com runtime.ReadMemStats ou exponha-as por meio das métricas do Prometheus. Campos principais: NumGC, PauseNs, HeapAlloc, HeapInuse.

var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Printf("GC cycles: %d, last pause: %dns\n", m.NumGC, m.PauseNs[(m.NumGC+255)%256])

Recolhedor

Um recolhedor em segundo plano devolve memória dinâmica ociosa ao sistema operacional. Ele é executado em paralelo e ajusta seu ritmo para não afetar o desempenho das operações em primeiro plano. A chamada de sistema MADV_FREE ou MADV_DONTNEED é usada.

Verificação rápida

O que GOMEMLIMIT faz no Go 1.19+?

Recapitulação: internos do coletor de lixo

Pontos principais:

  • Marcação e varredura tricolor concorrentes; duas breves pausas STW
  • GOGC controla a proporção de crescimento da memória dinâmica; padrão 100 (um crescimento de 100% aciona o coletor de lixo)
  • GOMEMLIMIT para garantir a segurança da memória em contêineres (Go 1.19+)
  • runtime.ReadMemStats para obter métricas do coletor de lixo

Perguntas Frequentes

A aula “Internals do coletor de lixo” é grátis?

Sim — o texto completo de “Internals do coletor de lixo” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.

O que vou aprender em “Internals do coletor de lixo”?

Marcação e varredura tricolor, GOGC e pausas do GC Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Go Academy?

Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Internals do coletor de lixo”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Go Academy?

Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Stack versus heap e análise de escape
  2. Modelo de memória do Go e Happens-Before
  3. Internals do coletor de lixo
  4. Reduzindo alocações: sync.Pool e arenas
← Voltar para Go Academy