Coleta de lixo em segundo plano
Na GC (coleta de lixo) em segundo plano, as gerações efêmeras (0 e 1) são coletadas conforme necessário enquanto a coleta da geração 2 está em andamento. A coleta de lixo em segundo plano é executada em um ou mais threads dedicados, dependendo do tipo de coleta (de estação de trabalho ou servidor), e é aplicada somente às coletas de geração 2.
A coleta de lixo em segundo plano é habilitada por padrão. Ela pode ser habilitada ou desabilitada com a definição de configuração gcConcurrent em aplicativos .NET Framework ou a configuração System.GC.Concurrent em aplicativos .NET Core e .NET 5 e posteriores.
Observação
A coleta de lixo em segundo plano substitui a coleta de lixo simultânea e está disponível no .NET Framework 4 e em versões posteriores. No .NET Framework 4, há suporte somente para a coleta de lixo de estação de trabalho. A partir do .NET Framework 4.5, a coleta de lixo em segundo plano está disponível para a coleta de lixo de estação de trabalho e servidor.
Uma coleta em gerações efêmeras durante a coleta de lixo em segundo plano é conhecida como coleta em primeiro plano. Quando as coletas de lixo em primeiro plano ocorrem, todos os threads gerenciados são suspensos.
Quando a coleta de lixo em segundo plano está em andamento e objetos suficientes foram alocados na geração 0, o CLR executa uma coleta em primeiro plano de geração 0 ou geração 1. O thread dedicado de coleta de lixo em segundo plano verifica em pontos frequentes de segurança se há uma solicitação de coleta de lixo em primeiro plano. Se houver, a coleta de plano de fundo suspende a si mesma para que a coleta de lixo em primeiro plano possa ocorrer. Após a conclusão da coleta de lixo em primeiro plano, os threads dedicados de coleta de lixo em segundo plano e os threads de usuário são retomados.
A coleta de lixo em segundo plano remove as restrições de alocação impostas pela coleta de lixo simultânea, pois as coletas de lixo efêmeras podem ocorrer durante a coleta de lixo em segundo plano. A coleta de lixo em segundo plano pode remover objetos mortos em gerações efêmeras. Ela também pode expandir o heap, se necessário, durante uma coleta de lixo de geração 1.
GC de estação de trabalho vs. de servidor em segundo plano
A partir do .NET Framework 4.5, a coleta de lixo em segundo plano está disponível para a GC de servidor. A GC em segundo plano é o modo padrão para coleta de lixo do servidor.
A coleta de lixo de servidor em segundo plano funciona de maneira semelhante a da estação de trabalho em segundo plano, mas há algumas diferenças:
A coleta de lixo de estação de trabalho em segundo plano usa um thread dedicado, enquanto a coleta de lixo de servidor em segundo plano usa diversos threads. Normalmente, há um thread dedicado para cada processador lógico.
Ao contrário do thread de coleta de lixo de estação de trabalho em segundo plano, os threads da GC de servidor não atingem o tempo limite.
A ilustração a seguir mostra a coleta de lixo de estação de trabalho em segundo plano executada em um thread dedicado separado:
A ilustração a seguir mostra a coleta de lixo de servidor em segundo plano executada em threads dedicados separados:
Coleta de lixo simultânea
Dica
Esta seção aplica-se a:
- .NET Framework 3.5 e anterior para coleta de lixo de estação de trabalho
- .NET Framework 4 e anteriores para coleta de lixo de servidor
A coleta de lixo simultânea é substituída pela coleta de lixo em segundo plano em versões posteriores.
Na coleta de lixo de estação de trabalho ou servidor, é possível habilitar a coleta de lixo simultânea, que permite que os threads sejam executados simultaneamente com um thread dedicado que executa a coleta de lixo durante a maior parte da duração da coleta. Essa opção afeta somente as coletas de lixo na geração 2. As gerações 0 e 1 são sempre não simultâneas porque terminam rápido.
A coleta de lixo simultânea permite que aplicativos interativos sejam mais responsivos minimizando a pausa para uma coleta. Na maioria das vezes, a execução dos threads gerenciados pode continuar enquanto o thread de coleta de lixo simultânea estiver em execução. Esse design resulta em pausas mais curtas enquanto uma coleta de lixo está ocorrendo.
A coleta de lixo simultânea é executada em um thread dedicado. Por padrão, o CLR executa a coleta de lixo de estação de trabalho com a coleta simultânea habilitada em computadores de processador único e multiprocessador.
A ilustração a seguir mostra a coleta de lixo simultânea executada em um thread dedicado separado.