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. Porém, 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:

  • A GC (coleta de lixo) da estação de trabalho, que foi projetada para aplicativos cliente. É a variante padrão da GC para aplicativos autônomos. Para aplicativos hospedados, por exemplo, aqueles hospedados por ASP.NET, o host determina a variante 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 os threads gerenciados continuem as operações durante uma coleta de lixo. A coleta de lixo em segundo plano substitui a coleta de lixo simultânea no .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 seguinte ilustração mostra os threads dedicados que executam a coleta de lixo em um servidor:

Server Garbage Collection Threads

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 executam o código nativo não são suspensos na coleta de lixo do servidor ou da estação de trabalho.)

  • A coleta de lixo de estação de trabalho é sempre usada em um computador que tem apenas uma CPU lógica, 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 coleção ocorre em vários threads dedicados. No Windows, esses threads são executados no nível de prioridade THREAD_PRIORITY_HIGHEST.

  • São fornecidos um heap e um thread dedicado para executar a coleta de lixo para cada CPU lógica, 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. Porém, isso é apenas uma generalização: o tamanho do segmento é específico à implementação e está sujeito a alterações. Não faça suposição 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 CPUs lógicas. Se todos os processos coletassem lixo ao mesmo tempo, eles interfeririam uns nos outros, pois haveria 12 threads agendados na mesma CPU lógica. Se os processos estiverem ativos, não será uma boa ideia que todos eles usem a GC do servidor.

Se você estiver executando centenas de instâncias de um aplicativo, considere usar a coleta de lixo de 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