Sobes.tech
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.