Partilhar via


Modos de latência

Para recuperar objetos, o coletor de lixo (GC) deve parar todos os threads em execução em um aplicativo. O período de tempo durante o qual o coletor de lixo está ativo é referido como a 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 intrusividade do coletor de lixo definindo a GCSettings.LatencyMode propriedade como um dos System.Runtime.GCLatencyMode valores.

Configurações de baixa latência

Usar uma configuração de latência "baixa" significa que o coletor de lixo invade menos seu aplicativo. A coleta de lixo é mais conservadora em relação à recuperação da memória.

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

  • GCLatencyMode.LowLatency suprime coleções de geração 2 e executa apenas coleções de geração 0 e 1. Pode ser usado apenas por curtos períodos de tempo. Durante períodos mais longos, se o sistema estiver sob pressão de memória, o coletor de lixo acionará uma coleta, que pode pausar brevemente o aplicativo e interromper uma operação de tempo crítico. Essa configuração está disponível apenas para a coleta de lixo da estação de trabalho.

  • GCLatencyMode.SustainedLowLatency suprime coleções de primeiro plano de geração 2 e executa apenas coleções de geração 0, 1 e geração 2 em segundo plano. Ele pode ser usado por longos períodos de tempo e está disponível para a coleta de lixo da estação de trabalho e do servidor. Essa configuração não pode ser usada se a coleta de lixo em segundo plano estiver desabilitada.

Durante períodos de baixa latência, as coleções de geração 2 são suprimidas, a menos que ocorra o seguinte:

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

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

Cenários

A tabela a seguir lista os cenários de aplicativo para usar os GCLatencyMode valores:

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

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

Este é o modo padrão para a coleta de lixo da estação de trabalho e do 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 aplicações que têm operações de curto prazo, sensíveis ao tempo, durante as quais as interrupções do coletor de lixo podem causar interrupções. Por exemplo, 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 um período de tempo contido, mas potencialmente maior, durante o qual as interrupções do coletor de lixo podem causar interrupções. Por exemplo, aplicativos que precisam de tempos de resposta rápidos à medida que os dados do mercado mudam durante o horário de negociação.

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

Diretrizes para o uso de baixa latência

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

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

  • Evite alocar grandes quantidades de memória durante períodos de baixa latência. Notificações de pouca memória podem ocorrer porque a coleta de lixo recupera menos objetos.

  • Enquanto estiver no modo de baixa latência, minimize o número de novas alocações, em particular alocações na pilha de objetos grandes e objetos fixos.

  • Esteja ciente dos tópicos que podem estar alocando. Como a configuração da propriedade é em todo o LatencyMode processo, OutOfMemoryException exceções podem ser geradas em qualquer thread que esteja alocando.

  • Envolva o código de baixa latência em regiões de execução restritas. Para obter mais informações, consulte Regiões de execução restritas.

  • Você pode forçar coleções de geração 2 durante um período de baixa latência chamando o GC.Collect(Int32, GCCollectionMode) método.

Consulte também