Coleta de lixo de estação de trabalho ou de servidor

O coletor de lixo tem autoajuste e pode trabalhar em uma ampla variedade de cenários. No entanto, você pode definir o tipo de coleta de lixo com base nas características da carga de trabalho. O CLR fornece os seguintes tipos de coleta de lixo:

  • Coleta de lixo de estação de trabalho (GC), que foi projetada para aplicativos cliente. É o GC padrão para aplicativos autônomos. Para aplicativos hospedados, por exemplo, aqueles hospedados por ASP.NET, o host determina o sabor padrão do GC.

    A coleta de lixo da estação de trabalho pode ser simultânea ou não simultânea. A coleta de lixo simultânea (ou em segundo plano) permite que threads gerenciados continuem operações durante uma coleta de lixo. A coleta de lixo em segundo plano substitui a coleta de lixo simultânea .NET Framework 4 e versões posteriores.

  • A coleta de lixo de servidor, que serve para aplicativos de servidor que precisam de escalabilidade e taxa de transferência altas.

    • No .NET Core, a coleta de lixo do servidor pode ser não simultânea ou em segundo plano.

    • No .NET Framework 4.5 e versões posteriores, a coleta de lixo do servidor pode ser não simultânea ou em segundo plano. No .NET Framework 4 e versões anteriores, a coleta de lixo do servidor não é simultânea.

A ilustração a seguir mostra os threads dedicados que executam a coleta de lixo em um servidor:

Threads de coleta de lixo do servidor

Considerações sobre o desempenho

GC da estação de trabalho

Veja a seguir considerações de desempenho e de threading para a coleta de lixo da estação de trabalho:

  • A coleção ocorre no thread do usuário que disparou a coleta de lixo e permanece com a mesma prioridade. Como os threads de usuário normalmente são executados com prioridade normal, o coletor de lixo (que é executado em um thread de prioridade normal) deve disputam competir outros threads por tempo da CPU. (Os threads que são executados em código nativo não são suspensos na coleta de lixo do servidor ou da estação de trabalho.)

  • A coleta de lixo da estação de trabalho sempre é usada em um computador que tem apenas um processador, independentemente da definição de configuração.

GC do servidor

Veja a seguir considerações de desempenho e de threading para a coleta de lixo de servidor:

  • A coleta ocorre em vários threads dedicados que estão em execução no nível de prioridade THREAD_PRIORITY_HIGHEST.

  • Fornece-se um heap e um thread dedicado para executar a coleta de lixo para cada CPU, e os heaps são coletados ao mesmo tempo. Cada heap contém um heap de objeto pequeno e um heap de objeto grande, e todos os heaps podem ser acessados pelo código do usuário. Objetos em heaps diferentes podem fazer referência entre si.

  • Como vários threads de coleta de lixo funcionam em conjunto, a coleta de lixo de servidor é mais rápida do que a coleta de lixo de estação de trabalho no heap de mesmo tamanho.

  • Geralmente, a coleta de lixo de servidor tem segmentos maiores. No entanto, isso é apenas uma generalização: o tamanho do segmento é específico da implementação e está sujeito a alterações. Não faça suposições sobre o tamanho dos segmentos alocados pelo coletor de lixo ao ajustar seu aplicativo.

  • A coleta de lixo de servidor pode usar bastante recursos. Por exemplo, imagine que há 12 processos que usam o GC do servidor em execução em um computador que tem quatro processadores. Se todos os processos coletam lixo ao mesmo tempo, eles interferem entre si, pois haverá 12 threads agendados no mesmo processador. Se os processos estão ativos, não é uma boa ideia que todos eles usem o GC do servidor.

Se você estiver executando centenas de instâncias de um aplicativo, considere usar a coleta de lixo da estação de trabalho com a coleta de lixo simultânea desabilitada. Isso resultará na redução da comutação de contexto, o que pode melhorar o desempenho.

Confira também