Nas linguagens de programação, um objeto pode ter apenas variável durante sua existência, após instanciação não pode ser modificado. Portanto, a mesma célula de memória não pode ser alocada para novos valores; portanto, é necessário algum tipo de gerenciamento de memória automatizado para gerenciar os espaços não utilizados. Esses espaços não utilizados são chamados de lixo e todo o processo de gerenciamento eficiente de memória é chamado de coleta de lixo.
O principal objetivo de um coletor de lixo é separar os objetos mortos dos objetos ativos e recuperar o espaço para reutilização. Basicamente, tudo funciona no heap gerenciado, que nada mais é do que um bloco de memória e o coletor de lixo verifica periodicamente a memória heap para alocar memória para novos objetos. Existem dois métodos para liberar recursos não gerenciados, como arquivos e conexões com o banco de dados: Dispose and Finalize.
Este artigo ajuda a entender a diferença entre os dois.
Dispose é uma maneira padrão para os usuários dizerem aos objetos para liberarem seus recursos e não tentarem acessar os objetos novamente. O método dispose fornece controle da limpeza explícita da memória, tornando os objetos inutilizáveis.
Quando os usuários chamam o método Dispose (), o objeto deve liberar todos os seus recursos caros, disponibilizando-o para reutilização. Ele nunca é chamado pelo coletor de lixo, que só é reproduzido quando a memória gerenciada se torna escassa. Uma interface especial chamada “IDisposable” é usada para decidir onde e como implementar Dispose (). Mas o que acontece quando o método de descarte não é chamado?
Se o método de descarte não for chamado, o plano de fallback será usar o método Finalize () para limpeza. É chamado pelo coletor de lixo para executar uma limpeza final de recursos antes de liberar memória. O conceito de limpeza oportuna se torna inaplicável aqui, porque, em vez de desalocar a memória imediatamente, o objeto é adicionado à fila de finalização apenas para ser destruído posteriormente. Finalize é mais como uma salvaguarda implementada no caso de um erro de programação e o descarte não limpa os recursos; nesse caso, o método Finalize () é chamado pelo coletor de lixo para remover objetos inacessíveis na sequência que desejar..
O método Dispose é chamado para acelerar a liberação de recursos não gerenciados, como identificadores de banco de dados, identificadores de arquivo, semáforos e outros objetos alocados pelo sistema operacional. O método dispose é chamado para executar o código necessário para limpar a memória não utilizada e recursos escassos, como identificadores GDI. Em termos simples, o método de descarte fornece controle da limpeza explícita da memória. O método Finalize, por outro lado, faz parte da coleta de lixo usada para executar a operação de limpeza final em um objeto antes de ser coletado. Simplificando, o método finalize é chamado para liberar recursos não gerenciados mantidos por um objeto antes que ele seja destruído.
O método Dispose pode ser chamado explicitamente pelo código do usuário e pela classe que está implementando o método para dispor de recursos. No entanto, a memória não pode ser liberada até que o coletor de lixo execute o processo de limpeza. O método pode ser chamado mesmo se outras referências ao objeto ainda existirem. O método finalize, pelo contrário, pode ser chamado pelo coletor de lixo apenas depois de determinar que a última instância do objeto de memória foi destruída e não existem mais referências ao objeto. Após a execução do método finalize, o objeto é removido da memória heap.
O processo de descarte de um objeto da memória é chamado de padrão de descarte, que pode ser usado para objetos que acessam recursos não gerenciados porque o coletor de lixo não pode recuperar recursos não gerenciados. A interface "IDisposable", juntamente com um método Dispose (Boolean) adicional, é implementado solicitando a liberação de recursos não gerenciados. Um método finalize é executado quando a instância de um objeto é destruída antes de sua desalocação. É um método não determinístico que ocorre a critério do coletor de lixo e pode até não ocorrer. Não deve ser implementado em objetos gerenciados até que seja extremamente necessário.
É muito mais rápido usar um método de descarte do que finalizar para descarte instantâneo de objetos. Os destruidores são convertidos automaticamente para finalizar o método em tempo de execução. É automaticamente invocado pelo coletor de lixo quando o objeto sai do escopo, o que geralmente acontece quando a instância desse objeto é destruída. O problema com o método finalize é que é um significado não determinístico, não é certo quando recuperar a memória que não está mais sendo referenciada por meio da coleta de lixo. No entanto, pode não liberar memória imediatamente; de fato, nunca pode ser chamado e não pode ser forçado explicitamente.
A principal diferença entre os métodos de descarte e finalização é que o primeiro é um método determinístico que descarta instantaneamente objetos quando não estão mais em uso, enquanto o segundo é um método não determinístico para alocar recursos não gerenciados, o que significa que é um método de recuperação para liberar instâncias de objetos de memória quando elas ficam fora do escopo antes da desalocação. É sempre aconselhável usar o método de descarte ao finalizar, a menos que seja extremamente necessário.
Em outros termos, finalize é uma salvaguarda criada para limpar recursos não gerenciados quando o método de descarte não pode ser chamado no caso de algum erro de programação. O método Finalize é chamado pelo coletor de lixo quando um objeto está prestes a ser expulso da memória heap.