Coletas induzidas

Na maioria dos casos, o coletor de lixo pode determinar o melhor momento para executar uma coleta e você deve permitir que ele seja executado de modo independente. Existem situações raras nas quais uma coleta forçada pode melhorar o desempenho do seu aplicativo. Nesses casos, você poderá induzir a coleta de lixo usando o método GC.Collect para forçar uma coleta de lixo.

Use o método GC.Collect quando houver uma redução significativa na quantidade de memória que está sendo usada em um ponto específico no código do aplicativo. Por exemplo, se o aplicativo usar uma caixa de diálogo complexo que tem vários controles, chamar Collect quando a caixa de diálogo é fechada poderá melhorar o desempenho, recuperando imediatamente a memória usada pela caixa de diálogo. Certifique-se de que seu aplicativo não está induzindo a coleta de lixo com muita frequência, pois isso poderá diminuir o desempenho se o coletor de lixo estiver tentando recuperar os objetos em horários não ideais. Você pode fornecer um valor de enumeração GCCollectionMode.Optimized para que o método Collect faça a coleta somente quando ela for produtiva, conforme discutido na próxima seção.

Modo de coleta de GC

Você pode usar uma das sobrecargas do método GC.Collect, que inclui um valor GCCollectionMode, para especificar o comportamento de uma coleta forçada do modo a seguir.

GCCollectionMode valor Descrição
Default Usa a configuração de coleta de lixo padrão para a versão do .NET Framework em execução.
Forced Força a coleta de lixo a ocorrer imediatamente. Isso é equivalente a chamar a sobrecarga GC.Collect(). Isso resulta em uma coleta de bloqueio total de todas as gerações.

Você também pode compactar o heap de objeto grande definindo a propriedade GCSettings.LargeObjectHeapCompactionMode como GCLargeObjectHeapCompactionMode.CompactOnce antes de forçar uma coleta de lixo de bloqueio completo imediata.
Optimized Permite que o coletor de lixo determine se o horário atual é ideal para recuperar objetos.

O coletor de lixo pode determinar que uma coleta não seria suficientemente produtiva para se justificar, caso em que ele retornará sem recuperar objetos.

Coletas de bloqueio ou em segundo plano

Você pode chamar a sobrecarga de método GC.Collect(Int32, GCCollectionMode, Boolean) para especificar se uma coleta induzida realiza o bloqueio ou não. O tipo de coleta executada depende de uma combinação dos parâmetros mode e blocking do método. mode é membro da enumeração GCCollectionMode, e blocking é um valor Boolean. A tabela a seguir resume a interação entre os argumentos mode e blocking.

mode blocking = true blocking = false
Forced ou Default Uma coleção de bloqueio é executada assim que possível. Se uma coleta em segundo plano estiver em andamento e a geração for 0 ou 1, o método Collect(Int32, GCCollectionMode, Boolean) disparará imediatamente uma coleta de bloqueio e retornará quando a coleção for concluída. Se uma coleta em segundo plano estiver em andamento e o parâmetro generation for 2, o método aguardará até que a coleta em segundo plano seja concluída, disparará uma coleta de bloqueio de geração 2 e retornará. Uma coleta é executada assim que possível. O método Collect(Int32, GCCollectionMode, Boolean) solicita uma coleta em segundo plano, mas isso não é garantido; dependendo das circunstâncias, uma coleta de bloqueio ainda pode ser executada. Se uma coleta em segundo plano já estiver em andamento, o método retornará imediatamente.
Optimized Uma coleta de bloqueio pode ser executada, dependendo do estado do coletor de lixo e do parâmetro generation. O coletor de lixo tenta fornecer um desempenho ideal. Uma coleta pode ser executada, dependendo do estado do coletor de lixo. O método Collect(Int32, GCCollectionMode, Boolean) solicita uma coleta em segundo plano, mas isso não é garantido; dependendo das circunstâncias, uma coleta de bloqueio ainda pode ser executada. O coletor de lixo tenta fornecer um desempenho ideal. Se uma coleta em segundo plano já estiver em andamento, o método retornará imediatamente.

Confira também