Sobes.tech
Middle

Quais são as fases de limpeza de recursos na gestão de memória?

sobes.tech IA

Resposta da IA

O gerenciamento de memória no .NET inclui as seguintes fases de limpeza de recursos:

  1. Fase de marcação (Marking): O coletor de lixo determina quais objetos estão acessíveis a partir dos objetos raiz (variáveis de pilha, variáveis estáticas e registros). Objetos inacessíveis são marcados para coleta.

  2. Fase de realocação (Relocating/Compacting): Os objetos acessíveis são movidos (compactados) na memória, liberando espaço contínuo e reduzindo a fragmentação. Durante esse processo, os ponteiros para os objetos realocados são atualizados. Essa fase ocorre apenas em compilações diferentes do modo de fundo.

  3. Fase de varredura (Sweeping): Os métodos finais (Finalize) dos objetos marcados para coleta são chamados, se estiverem definidos. Depois, a memória ocupada por esses objetos é liberada.

Exemplo de uso de Finalize (não recomendado, é melhor usar IDisposable):

public class ResourceHolder
{
    // Recurso que requer liberação
    private System.IO.StreamWriter _writer;

    public ResourceHolder(string filePath)
    {
        _writer = new System.IO.StreamWriter(filePath);
    }

    // Método finalizador, chamado pelo coletor de lixo
    ~ResourceHolder()
    {
        // Liberar recurso não gerenciado
        _writer?.Dispose();
    }

    // Outros métodos da classe...
}