Compartilhar via


Modos de latência

Para recuperar objetos, o GC (coletor de lixo) deve interromper todos os threads em execução em um aplicativo. O período durante o qual o coletor de lixo está ativo é conhecido como sua latência.

Em algumas situações, como quando um aplicativo recupera dados ou exibe conteúdo, uma coleta de lixo completa pode ocorrer em um momento crítico e impedir o desempenho. Você pode ajustar a intrusão do coletor de lixo, definindo a propriedade GCSettings.LatencyMode como um dos valores System.Runtime.GCLatencyMode.

Configurações de baixa latência

Usar uma configuração de latência "baixa" significa que o coletor de lixo interfere menos no aplicativo. A coleta de lixo é mais conservadora quanto à recuperação de memória.

A enumeração System.Runtime.GCLatencyMode fornece duas configurações de baixa latência:

  • GCLatencyMode.LowLatency suprime coletas da geração 2 e executa somente coletas da geração 0 e 1. Ela pode ser usada somente por curtos períodos. Em períodos mais longos, se o sistema estiver sob pressão de memória, o coletor de lixo disparará uma coleção, que pode pausar o aplicativo rapidamente e interromper uma operação de tempo crítico. Essa configuração está disponível somente para coleta de lixo de estação de trabalho.

  • GCLatencyMode.SustainedLowLatency suprime coletas da geração 2 em primeiro plano e executa somente a geração 0, 1 e coletas da geração 2 em segundo plano. Ela pode ser usada por longos períodos e está disponível para coleta de lixo de estação de trabalho e servidor. Essa configuração não poderá ser usada se a coleta de lixo em segundo plano estiver desabilitada.

Durante períodos de baixa latência, coletas da geração 2 são suprimidas, a menos que ocorra o seguinte:

  • O sistema recebe uma notificação de falta de memória do sistema operacional.

  • O código do aplicativo induz uma coleção chamando o método GC.Collect e especificando 2 para o parâmetro generation.

Cenários

A seguinte tabela lista os cenários de aplicativo para uso dos valores GCLatencyMode:

Modo de latência Cenários de aplicativos
Batch Para aplicativos que não têm operações de interface do usuário ou do servidor.

Quando a coleta de lixo em segundo plano é desabilitada, esse é o modo padrão para coleta de lixo de estação de trabalho e servidor. O modo Batch também substitui a configuração gcConcurrent, ou seja, impede coleções em segundo plano ou simultâneas.
Interactive Para a maioria dos aplicativos que têm uma interface do usuário.

Esse é o modo padrão para coleta de lixo de estação de trabalho e servidor. No entanto, se um aplicativo estiver hospedado, as configurações do coletor de lixo do processo de hospedagem terão precedência.
LowLatency Para aplicativos que têm operações de curto prazo, sensíveis ao tempo, durante o qual as interrupções do coletor de lixo podem ser prejudiciais. Por exemplo, os aplicativos que renderizam animações ou funções de aquisição de dados.
SustainedLowLatency Para aplicativos que têm operações sensíveis ao tempo, por uma duração contida, mas potencialmente maior, durante a qual as interrupções do coletor de lixo poderiam ser prejudiciais. Por exemplo, aplicativos que precisam de tempos de resposta rápidos, como alterações de dados de mercado durante o horário comercial.

Esse modo resulta em um tamanho maior do heap gerenciado do que outros modos. Como ele não compacta o heap gerenciado, é possível maior fragmentação. Verifique se há memória suficiente disponível.

Diretrizes para uso de baixa latência

Ao usar o modo GCLatencyMode.LowLatency, considere as seguintes diretrizes:

  • Mantenha o período de baixa latência o mais curto possível.

  • Evite a alocação de grande quantidade de memória durante períodos de baixa latência. Notificações de memória insuficiente podem ocorrer porque a coleta de lixo recupera menos objetos.

  • No modo de baixa latência, minimize o número de alocações, principalmente alocações em heap de objetos grandes e objetos fixados.

  • Esteja atento a ameaças que possam ser alocadas. Como a configuração da propriedade LatencyMode é para todo o processo, exceções OutOfMemoryException podem ser geradas em qualquer thread que esteja alocando.

  • Encapsule o código de baixa latência em regiões de execução restrita. Para mais informações, confira Regiões de execução restrita.

  • Você pode forçar coletas da geração 2 durante um período de baixa latência ao chamar o método GC.Collect(Int32, GCCollectionMode).

Confira também