Recolha de lixo de fundo
Na coleta de lixo de fundo (GC), 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 se é estação de trabalho ou GC do servidor, e se aplica apenas às coleções de geração 2.
A coleta de lixo em segundo plano está habilitada por padrão. Ele pode ser habilitado ou desabilitado com a configuração gcConcurrent em aplicativos .NET Framework ou a configuração System.GC.Concurrent em aplicativos .NET Core e .NET 5 e posteriores.
Nota
A coleta de lixo em segundo plano substitui a coleta de lixo simultânea e está disponível no .NET Framework 4 e versões posteriores. No .NET Framework 4, ele é suportado apenas para a coleta de lixo da 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 da estação de trabalho e do servidor .
Uma coleta sobre gerações efêmeras durante a coleta de lixo de fundo é conhecida como coleta de lixo em primeiro plano . Quando ocorrem coletas de lixo em primeiro plano, todos os threads gerenciados são suspensos.
Quando a coleta de lixo em segundo plano está em andamento e você alocou objetos suficientes na geração 0, o CLR executa uma coleta de lixo em primeiro plano de geração 0 ou geração 1. O thread dedicado de coleta de lixo em segundo plano verifica em pontos seguros frequentes para determinar se há uma solicitação de coleta de lixo em primeiro plano. Se houver, a coleta em segundo plano se suspende para que a coleta de lixo em primeiro plano possa ocorrer. Depois que a coleta de lixo em primeiro plano for concluída, os threads dedicados de coleta de lixo em segundo plano e os threads de usuário serão retomados.
A coleta de lixo em segundo plano remove as restrições de alocação impostas pela coleta de lixo simultânea, porque as coletas de lixo efêmeras podem ocorrer durante a coleta de lixo em segundo plano. A coleta de lixo de fundo pode remover objetos mortos em gerações efêmeras. Ele também pode expandir a pilha, se necessário, durante uma coleta de lixo de geração 1.
Estação de trabalho em segundo plano vs. GC do servidor
A partir do .NET Framework 4.5, a coleta de lixo em segundo plano está disponível para o GC do servidor. GC em segundo plano é o modo padrão para a coleta de lixo do servidor.
A coleta de lixo do servidor em segundo plano funciona de forma semelhante à coleta de lixo da estação de trabalho em segundo plano, mas há algumas diferenças:
A coleta de lixo da estação de trabalho em segundo plano usa um thread de coleta de lixo em segundo plano dedicado, enquanto a coleta de lixo do servidor em segundo plano usa vários threads. Normalmente, há um thread dedicado para cada processador lógico.
Ao contrário do thread de coleta de lixo em segundo plano da estação de trabalho, os threads GC do servidor em segundo plano não atingem o tempo limite.
A ilustração a seguir mostra a coleta de lixo da estação de trabalho em segundo plano realizada em um thread separado e dedicado:
A ilustração a seguir mostra a coleta de lixo do servidor em segundo plano executada em threads separados e dedicados:
Recolha simultânea de lixo
Gorjeta
Esta secção aplica-se a:
- .NET Framework 3.5 e versões anteriores para coleta de lixo da estação de trabalho
- .NET Framework 4 e versões anteriores para coleta de lixo do servidor
O lixo simultâneo é substituído pela coleta de lixo em segundo plano em versões posteriores.
Na coleta de lixo da estação de trabalho ou do servidor, você pode habilitar a coleta de lixo simultânea, o 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. Esta opção afeta apenas as coletas de lixo na geração 2; As gerações 0 e 1 são sempre não concorrentes porque terminam rápido.
A coleta simultânea de lixo permite que os aplicativos interativos sejam mais responsivos, minimizando as pausas de uma coleta. Os threads gerenciados podem continuar a ser executados na maioria das vezes enquanto o thread de coleta de lixo simultâneo está em execução. Esse design resulta em pausas mais curtas enquanto ocorre uma coleta de lixo.
A coleta simultânea de lixo é realizada em um thread dedicado. Por padrão, o CLR executa a coleta de lixo da estação de trabalho com a coleta de lixo simultânea habilitada em computadores com processador único e multiprocessador.
A ilustração a seguir mostra a coleta de lixo simultânea realizada em um thread dedicado separado.