Compartilhar via


Coleta de lixo em segundo plano

Na coleta de lixo em segundo plano (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 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. 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.

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 versões posteriores. No .NET Framework 4, há suporte apenas para 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 tanto para coleta em estações de trabalho quanto em servidores.

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 você aloca 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 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 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 o GC do servidor. O GC em segundo plano é o modo padrão para 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 em segundo plano da estação de trabalho usa um thread dedicado, enquanto a coleta de lixo em segundo plano do servidor usa vários 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:

Coleta de lixo de estação de trabalho em segundo plano

A ilustração a seguir mostra a coleta de lixo do servidor em segundo plano executada em threads separados e dedicados:

Coleta de lixo de servidor em segundo plano

Coleta de lixo simultânea

Dica

Esta seção se aplica a:

  • .NET Framework 3.5 e anteriores para coleta de lixo de estação de trabalho
  • .NET Framework 4 e 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 de servidor ou estação de trabalho, você pode habilitar a coleta de lixo simultânea, que permite que os threads são executados simultaneamente com um thread dedicado que executa a coleta de lixo durante a maior parte da coleta. Essa opção afeta apenas as coletas de lixo na geração 2; as gerações 0 e 1 são sempre não simultâneas porque terminam rapidamente.

A coleta de lixo simultânea permite que aplicativos interativos sejam mais responsivos minimizando pausas para uma coleção. Os threads gerenciados podem continuar a ser executados na maior parte do tempo enquanto o thread de coleta de lixo simultâneo está 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 coleta de lixo 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.

Threads de coleta de lixo simultânea

Consulte também