Sobes.tech
Middle

Qual é o conceito de recolha de lixo em C#?

sobes.tech IA

Resposta da IA

O recolhedor de lixo (GC) gere automaticamente a memória, libertando-a de objetos que já não são utilizados pelo programa. Funciona em modo automático, eliminando a necessidade de gerir manualmente a alocação e libertação de memória, o que reduz o risco de fugas de memória e erros relacionados com ponteiros.

O processo de recolha de lixo inclui as seguintes etapas:

  1. Marcação (Marking): O GC determina quais objetos ainda estão em uso. Para isso, começa com um conjunto de objetos raiz (por exemplo, variáveis globais ou objetos nas pilhas dos threads atuais) e marca todos os objetos acessíveis a partir deles.
  2. Compactação (Compacting): O GC move os objetos sobreviventes na memória para libertar blocos contíguos para uma distribuição mais eficiente de nova memória. Esta etapa também atualiza os ponteiros para os objetos movidos.
  3. Limpeza (Sweeping): O GC liberta a memória ocupada por objetos que não foram marcados como utilizados.

O GC em .NET é generacional. A memória é dividida em gerações:

  • Geração 0 (Gen 0): Contém objetos de curta duração. A recolha desta geração ocorre com maior frequência.
  • Geração 1 (Gen 1): É um buffer para objetos que sobreviveram à recolha de Gen 0. É recolhida com menos frequência do que Gen 0.
  • Geração 2 (Gen 2): Contém objetos de longa duração. É recolhida com menos frequência e requer maior desempenho.

Os objetos movem-se entre gerações conforme "sobrevivam" nas recolhas de lixo.

Por exemplo, a criação e uso de um objeto:

// Criação do objeto
MyObject obj = new MyObject();
// Uso do objeto
obj.DoSomething();
// O objeto já não é utilizado, o GC pode recolhê-lo
obj = null;

A chamada forçada à recolha de lixo pode ser feita com GC.Collect(), mas geralmente não é recomendada, pois o GC otimiza automaticamente o momento das recolhas.

// Execução forçada da recolha de lixo (não recomendada na maioria dos casos)
GC.Collect();
GC.WaitForPendingFinalizers(); // Espera pela finalização dos finalizadores