Coleta de lixo

Definição - o que significa coleta de lixo?

A coleta de lixo, no contexto do .NET, é o processo pelo qual o common language runtime (CLR) do .NET framework gerencia a memória alocando e liberando memória automaticamente.

O coletor de lixo do .NET tenta compactar a memória de forma a aumentar o espaço de trabalho necessário para o heap. A classe GC da biblioteca de classes .NET controla o coletor de lixo. A tarefa principal de realizar uma coleta é executada pelo mecanismo de otimização do GC que determina o melhor momento para realizar a coleta com base nas alocações feitas. As execuções de GC são não determinísticas, pois a chamada para GC não pode ser garantida. No entanto, chamadas explícitas para o método 'Collect ()' sobrecarregado da classe GC podem ser usadas sempre que necessário.

As vantagens que o GC oferece incluem:

  • a eliminação do código de desalocação de memória em aplicativos
  • uso de memória otimizado no heap gerenciado
  • limpar a memória de objetos recuperados que não estão mais em uso (o que ajuda a inicializar objetos gerenciados alocados no futuro e fornecer segurança de memória de objetos para evitar que um objeto use conteúdo de outro).

Definirtec explica a coleta de lixo

O GC gerencia a memória virtual no heap gerenciado, que é o segmento de memória usado para armazenar e gerenciar objetos criados em um processo gerenciado. Se um objeto não tem nenhuma referência e não pode ser alcançado ou usado, ele se torna lixo. Enquanto o GC realiza uma coleta em um thread separado, todos os objetos inutilizáveis ​​são enumerados e a memória alocada para eles é recuperada.

A coleta de lixo é executada em situações como quando o sistema tem pouca memória física ou onde a memória alocada no heap gerenciado excede o valor limite aceitável. Como o GC é executado periodicamente, geralmente não há necessidade de chamar o método GC.Collect ().

As duas opções nas quais o GC pode ser configurado para especificar a maneira pela qual o CLR precisa executar são 1) estação de trabalho e 2) coleta de lixo do servidor. A principal diferença entre os dois é que o primeiro ocorre no encadeamento do usuário que acionou o GC, enquanto o último ocorre nos encadeamentos em execução no nível de prioridade mais alto. Além disso, a estação de trabalho GC é sempre usada em um sistema com um único processador, enquanto o servidor GC consome muitos recursos com segmentos de tamanho maior e é usado em sistemas com vários processadores.

Os dois tipos de coleções possíveis são completos e parciais. Uma coleção completa é executada interrompendo a execução do programa e visitando cada objeto, seguindo seu ponteiro de objeto e marcando o objeto como alcançável (ou vivo) ou inacessível (ou condenado). Depois de visitar os objetos, a memória dos objetos inacessíveis é recuperada e os objetos vivos são deslocados para que a memória alocada seja contígua, sem qualquer desperdício de espaço entre eles. A coleta parcial procura apenas uma parte do heap e é usada quando a coleta completa é considerada cara.

A limitação do GC é que ele não libera os objetos não utilizados que ainda são referenciados, o que pode causar vazamentos de memória.

Esta definição foi escrita no contexto do .NET