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:
- 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.
- 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.
- 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