Sobes.tech
Junior

O que é o coletor de lixo (Garbage Collector) em C#?

sobes.tech IA

Resposta da IA

O recolhedor de lixo em C# faz parte do ambiente de execução .NET (CLR), que gere automaticamente a memória libertando recursos ocupados por objetos que já não estão acessíveis.

Princípios de funcionamento:

  • Rastreamento de objetos: O recolhedor de lixo rastreia os objetos criados no monte gerido.
  • Determinação de acessibilidade: Determina quais objetos são acessíveis ao código em execução (ou seja, que têm referências válidas).
  • Recolha de objetos inacessíveis: Os objetos que já não são acessíveis são considerados "lixo" e podem ser removidos com segurança.

O processo de recolha inclui:

  1. Marcação (Marking). O GC escaneia a pilha e os registos para encontrar as raízes (objetos raízes). A partir das raízes, percorre o grafo de objetos, marcando os objetos acessíveis.
  2. Compactação (Compacting). Permite reduzir a fragmentação da memória. O GC move os objetos acessíveis para um bloco contíguo de memória, deixando espaço livre.
  3. Varredura (Sweeping). Os objetos inacessíveis (não marcados) são eliminados e a sua memória é libertada.

Características principais:

  • Gestão automática: Elimina a responsabilidade manual do programador para libertar memória.
  • Gerações: O monte é dividido em gerações (Gen 0, Gen 1, Gen 2). Isto otimiza a recolha, pois a maioria dos objetos torna-se lixo rapidamente. Os objetos novos são criados em Gen 0. Se um objeto sobrevive à recolha em Gen 0, é movido para Gen 1, e assim por diante.
  • Finalizadores e libertação (Finalizers and Disposal): O GC não garante a execução imediata dos finalizadores para objetos que implementam IDisposable. Para libertar recursos não geridos, deve-se usar um mecanismo explícito (Dispose(), declaração using).
// Exemplo de uso da declaração using para libertar recursos explicitamente
using (var stream = new System.IO.FileStream("temp.txt", System.IO.FileMode.Create))
{
    // Trabalhar com o ficheiro
} // stream.Dispose() será chamado automaticamente