Compartilhar via


Coleta de lixo em estações de trabalho e servidores

O coletor de lixo é autoadaptável e pode funcionar 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:

  • A GC (coleta de lixo) da estação de trabalho, que foi projetada para aplicativos cliente. É a variante padrão do GC para aplicativos autônomos. Para aplicativos hospedados, por exemplo, aqueles hospedados por ASP.NET, o host determina o tipo 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.

  • Coleta de lixo do servidor, que se destina a aplicativos de servidor que precisam de alto desempenho e escalabilidade.

    • 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 nas 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 de servidor

Considerações sobre 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 coleta ocorre no thread do usuário que disparou a coleta de lixo e permanece na 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 competir com outros threads por tempo de CPU. (Os threads que executam 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 uma CPU lógica, independentemente da configuração.

GC do servidor

A seguir estão as considerações sobre gerenciamento de threads e desempenho para coleta de lixo do servidor:

  • A coleção ocorre em vários threads dedicados. No Windows, esses threads são executados no THREAD_PRIORITY_HIGHEST nível de prioridade.

  • 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 objetos pequeno e um heap de objetos 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.

  • A coleta de lixo do servidor geralmente tem segmentos de tamanho maior. 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 do servidor pode ter uso intensivo de 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 coletarem lixo ao mesmo tempo, eles interferirão uns com os outros, pois haveria 12 threads agendados na mesma CPU lógica. Se os processos estiverem 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á em menos troca de contexto, o que pode melhorar o desempenho.

Consulte também