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:

Background workstation garbage collection

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

Background server garbage collection

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.

Concurrent Garbage Collection Threads

Confira também