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).