Coleções Induzidas
Na maioria dos casos, o coletor de lixo pode determinar o melhor momento para realizar uma coleta, e você deve deixá-la funcionar de forma independente. Há raras situações em que uma coleta forçada pode melhorar o desempenho do seu aplicativo. Nesses casos, você pode induzir a coleta de lixo usando o GC.Collect método para forçar uma coleta de lixo.
Use o GC.Collect método quando houver uma redução significativa na quantidade de memória que está sendo usada em um ponto específico no código do seu aplicativo. Por exemplo, se seu aplicativo usa uma caixa de diálogo complexa que tem vários controles, chamar Collect quando a caixa de diálogo é fechada pode 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, porque isso pode diminuir o desempenho se o coletor de lixo estiver tentando recuperar objetos em momentos não ideais. Você pode fornecer um GCCollectionMode.Optimized valor de enumeração para o Collect método para coletar somente quando a coleta for produtiva, conforme discutido na próxima seção.
Modo de recolha GC
Você pode usar uma das sobrecargas de GC.Collect método que inclui um GCCollectionMode valor para especificar o comportamento de uma coleção forçada da seguinte maneira.
GCCollectionMode valor |
Description |
---|---|
Default | Usa a configuração de coleta de lixo padrão para a versão em execução do .NET. |
Forced | Força a coleta de lixo a ocorrer imediatamente. Isso equivale a chamar a GC.Collect() sobrecarga. Isso resulta em uma coleção de bloqueio completo de todas as gerações. Você também pode compactar a pilha de objeto grande definindo a GCSettings.LargeObjectHeapCompactionMode propriedade como GCLargeObjectHeapCompactionMode.CompactOnce antes de forçar uma coleta de lixo de bloqueio total imediata. |
Optimized | Permite que o coletor de lixo determine se o tempo atual é ideal para recuperar objetos. O coletor de lixo poderia determinar que uma coleta não seria produtiva o suficiente para ser justificada, caso em que retornará sem recuperar objetos. |
Coleções em segundo plano ou de bloqueio
Você pode chamar a sobrecarga de GC.Collect(Int32, GCCollectionMode, Boolean) método para especificar se uma coleção induzida está bloqueando ou não. O tipo de recolha realizada depende de uma combinação do método e blocking
dos parâmetrosmode
. mode
é um membro da GCCollectionMode enumeração e blocking
é um Boolean valor. A tabela a seguir resume a interação dos mode
argumentos e blocking
.
mode |
blocking = true |
blocking = false |
---|---|---|
Forced ou Default | Uma coleta de bloqueio é realizada o mais rápido possível. Se uma coleção em segundo plano estiver em andamento e a geração for 0 ou 1, o Collect(Int32, GCCollectionMode, Boolean) método acionará imediatamente uma coleção de bloqueio e retornará quando a coleção for concluída. Se uma coleção em segundo plano estiver em andamento e o generation parâmetro for 2, o método aguardará até que a coleção em segundo plano seja concluída, acionará uma coleção de bloqueio de geração 2 e retornará. |
A recolha é realizada o mais rapidamente possível. O Collect(Int32, GCCollectionMode, Boolean) método solicita uma coleta em segundo plano, mas isso não é garantido, dependendo das circunstâncias, uma coleta de bloqueio ainda pode ser realizada. Se uma coleção em segundo plano já estiver em andamento, o método retornará imediatamente. |
Optimized | Uma coleta de bloqueio pode ser realizada, dependendo do estado do coletor de lixo e do generation parâmetro. O coletor de lixo tenta fornecer um desempenho ideal. |
A coleta pode ser realizada, dependendo do estado do coletor de lixo. O Collect(Int32, GCCollectionMode, Boolean) método solicita uma coleta em segundo plano, mas isso não é garantido, dependendo das circunstâncias, uma coleta de bloqueio ainda pode ser realizada. O coletor de lixo tenta fornecer um desempenho ideal. Se uma coleção em segundo plano já estiver em andamento, o método retornará imediatamente. |