Middle+
Como funciona o coletor de lixo na linguagem de programação Go?
sobes.tech IA
Resposta da IA
O recolhedor de lixo em Go baseia-se num algoritmo de marcação e varrimento com um disparador baseado na alocação de memória. Funciona em paralelo com o programa principal e minimiza as pausas.
Pontos-chave:
- Três conjuntos de cores:
- Branco: Objetos não visitados e potencialmente lixo.
- Cinza: Objetos acessíveis a partir das raízes, mas ainda não escaneados.
- Preto: Objetos acessíveis a partir das raízes e já escaneados.
- Marcação: O recolhedor começa pelas raízes (variáveis globais, pilha de cada goroutine), marcando objetos acessíveis como cinza. Depois, escaneia recursivamente objetos cinza, marcando como cinza os acessíveis a partir deles, e objetos escaneados tornam-se pretos.
- Fase STW (Stop-The-World) durante a marcação: Uma breve paragem na execução de todas as goroutines no início da marcação para criar uma instantânea do grafo de objetos e no final para alterar o estado.
- Marcaçao paralela: A maior parte da marcação é feita em paralelo com a execução do programa.
- Remoção: Após a marcação, todos os objetos que permanecem brancos são considerados inacessíveis e libertados. Go não requer zerar explicitamente os ponteiros.
// Exemplo: quando um objeto se torna inacessível
type Data struct {
value int
}
func main() {
d1 := &Data{value: 10} // Objeto criado, acessível
_ = d1 // Uso do objeto
d1 = nil // O objeto já não é acessível a partir da variável d1.
// O recolhedor de lixo pode libertá-lo no próximo ciclo.
// Outros objetos aos quais ninguém faz referência também podem ser recolhidos.
}
- Disparador: O recolhedor inicia quando a memória alocada excede um limiar que depende do volume de memória previamente utilizado. Por padrão, este limiar é o dobro do volume de memória utilizado anteriormente.
- Objetivo: Manter baixa latência, evitando pausas longas "Stop-The-World".
// Pode-se gerir o comportamento do recolhedor através de variáveis de ambiente
// por exemplo, definindo GOGC=off, a recolha de lixo é desativada.
No geral, o recolhedor de lixo de Go é eficiente e requer intervenção mínima do programador.