System.GC classe
Este artigo fornece observações complementares à documentação de referência para essa API.
A GC classe controla o coletor de lixo. O coletor de lixo é um componente de tempo de execução de linguagem comum que controla a alocação e a liberação de memória gerenciada. Os métodos nessa classe influenciam quando a coleta de lixo é executada em um objeto e quando os recursos alocados por um objeto são liberados. As propriedades nessa classe fornecem informações sobre a quantidade total de memória disponível no sistema e a categoria de idade, ou geração, de memória alocada para um objeto.
O coletor de lixo rastreia e recupera objetos alocados na memória gerenciada. Periodicamente, o coletor de lixo realiza a coleta de lixo para recuperar a memória alocada em objetos para os quais não há referências válidas. A coleta de lixo acontece automaticamente quando uma solicitação de memória não pode ser satisfeita usando a memória livre disponível. Como alternativa, um aplicativo pode forçar a coleta de lixo usando o Collect método.
A coleta de lixo consiste nas seguintes etapas:
- O coletor de lixo procura objetos gerenciados que são referenciados no código gerenciado.
- O coletor de lixo tenta finalizar objetos que não são referenciados.
- O coletor de lixo libera objetos que não são referenciados e recupera sua memória.
Recursos não gerenciados
Durante uma coleta, o coletor de lixo não liberará um objeto se encontrar uma ou mais referências ao objeto no código gerenciado. No entanto, o coletor de lixo não reconhece referências a um objeto de código não gerenciado e pode liberar objetos que estão sendo usados exclusivamente em código não gerenciado, a menos que explicitamente impedido de fazê-lo. O KeepAlive método fornece um mecanismo que impede que o coletor de lixo colete objetos que ainda estão em uso em código não gerenciado.
Além das alocações de memória gerenciada, as implementações do coletor de lixo não mantêm informações sobre recursos mantidos por um objeto, como identificadores de arquivo ou conexões de banco de dados. Quando um tipo usa recursos não gerenciados que devem ser liberados antes que as instâncias do tipo sejam recuperadas, o tipo pode implementar um finalizador.
Na maioria dos casos, os finalizadores são implementados substituindo o Object.Finalize método, no entanto, tipos escritos em C# ou C++ implementam destruidores, que os compiladores transformam em uma substituição de Object.Finalize. Na maioria dos casos, se um objeto tiver um finalizador, o coletor de lixo o chama antes de liberar o objeto. No entanto, o coletor de lixo não é obrigado a chamar finalizadores em todas as situações; Por exemplo, o método impede explicitamente que o SuppressFinalize finalizador de um objeto seja chamado. Além disso, o coletor de lixo não é obrigado a usar um thread específico para finalizar objetos ou garantir a ordem em que os finalizadores são chamados para objetos que fazem referência uns aos outros, mas estão disponíveis para coleta de lixo.
Em cenários em que os recursos devem ser liberados em um momento específico, as classes podem implementar a IDisposable interface, que contém o método que executa tarefas IDisposable.Dispose de limpeza e gerenciamento de recursos. As classes que implementam Dispose devem especificar, como parte de seu contrato de classe, se e quando os consumidores de classe chamam o método para limpar o objeto. O coletor de lixo, por padrão, não chama o método, no entanto, implementações do Dispose método podem chamar métodos na GC classe para personalizar o Dispose comportamento de finalização do coletor de lixo.
Para obter mais informações sobre a finalização de objetos e o padrão de descarte, consulte Limpando recursos não gerenciados.
Envelhecimento de objetos e gerações
O coletor de lixo no Common Language Runtime oferece suporte ao envelhecimento de objetos usando gerações. Uma geração é uma unidade de medida da idade relativa dos objetos na memória. O número de geração, ou idade, de um objeto indica a geração à qual um objeto pertence. Os objetos criados mais recentemente fazem parte de gerações mais recentes e têm números de geração mais baixos do que os objetos criados anteriormente no ciclo de vida do aplicativo. Os objetos da geração mais recente estão na geração 0. Essa implementação do coletor de lixo suporta três gerações de objetos, as gerações 0, 1 e 2. Você pode recuperar o valor da propriedade para determinar o número máximo de MaxGeneration geração suportado pelo sistema.
O envelhecimento de objetos permite que os aplicativos direcionem a coleta de lixo a um conjunto específico de gerações, em vez de exigir que o coletor de lixo avalie todas as gerações. As sobrecargas do Collect método que incluem um generation
parâmetro permitem especificar a geração mais antiga a ser coletada.
Não permitir a coleta de lixo
O coletor de lixo oferece suporte a um modo de latência de região sem GC que pode ser usado durante a execução de caminhos críticos nos quais a coleta de lixo pode afetar negativamente o desempenho de um aplicativo. O modo sem latência de região GC requer que você especifique uma quantidade de memória que possa ser alocada sem interferência do coletor de lixo. Se o tempo de execução puder alocar essa memória, o tempo de execução não executará uma coleta de lixo enquanto o código no caminho crítico estiver sendo executado.
Você define o início do caminho crítico da região sem GC chamando uma das sobrecargas do TryStartNoGCRegion. Você especifica o final de seu caminho crítico chamando o EndNoGCRegion método.
Não é possível aninhar chamadas para o método e você só deve chamar o método se o TryStartNoGCRegionEndNoGCRegion tempo de execução estiver atualmente no modo de latência de região GC. Em outras palavras, você não deve chamar TryStartNoGCRegion várias vezes (após a primeira chamada de método, as chamadas subsequentes não terão êxito) e não deve esperar que as chamadas EndNoGCRegion sejam bem-sucedidas apenas porque a primeira chamada foi TryStartNoGCRegion bem-sucedida.