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:
- Assistência de marcação: As goroutines do utilizador ajudam o recolhedor na fase de marcação durante a alocação de memória.
- Marcação: Marcação paralela de objetos acessíveis.
- Finalização da marcação: Uma fase curta STW para finalizar a marcação.
- 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.