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
- Stack versus heap e análise de escape
- Modelo de memória do Go e Happens-Before
- Internals do coletor de lixo
- Reduzindo alocações: sync.Pool e arenas