Como a escolha do Modo do Garbage Collector pode impactar sua aplicação em .NET
Tags: csharp, dotnet, dotnetcore, programming
Published: 2023-04-12 18:04:20

Existem diferentes modos de GC disponíveis no .NET, cada um com seus próprios prós e contras. Neste contexto, vamos explorar os diferentes modos de GC disponíveis no .NET e suas características. Ao entender melhor como os diferentes modos de GC funcionam, os desenvolvedores podem tomar decisões informadas sobre como otimizar o desempenho de seus aplicativos .NET.

Para entender como o tempo de pausa do coletor de lixo (GC) e os recursos consumidos são afetados, é importante compreender como funcionam os modos Concorrente e Não Concorrente.

O modo Não Concorrente (também conhecido como stop-the-world) interrompe todas as threads gerenciadas, paralisando a aplicação por completo. Durante essa pausa, não ocorre alocação de memória e a execução da aplicação fica suspensa até que o GC conclua sua tarefa.

![Non-Concurrent](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1sjwxj10t602dcym1uuq.png)

Já o modo Concorrente executa a maior parte do trabalho sem interromper as threads gerenciadas, minimizando o tempo de pausa da aplicação. Entretanto, esse modo não executa a compactação da memória.

![Concurrent](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ka0pe27r9rn6s6qo1hp.png)

Existem dois outros modos de GC além dos modos Concorrente e Não Concorrente, que são o Workstation e o Server.

O modo Workstation foi projetado para aplicativos em que a interatividade do usuário requer uma resposta rápida, oferecendo pausas tão curtas quanto possível. Para isso, o GC é executado com maior frequência, diminuindo o trabalho de coleta e, consequentemente, oferecendo menores pausas e menor consumo de memória. No modo Workstation, o GC é executado em uma única thread e não economiza recursos durante a execução. Além disso, os segmentos são menores.

![Workstation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qi42cflhl2atx8mf556g.png)

Por outro lado, o modo Server foi desenvolvido para maximizar o processamento simultâneo de aplicativos com múltiplas solicitações/requisições, o que significa que as pausas são imprevisíveis, uma vez que o objetivo é maximizar a quantidade de respostas e, portanto, o GC ocorrerá com menos frequência, podendo causar pausas mais longas. Como o GC é menos acionado, a tendência é que a aplicação consuma mais memória e, por haver mais objetos na memória para serem removidos, o consumo de CPU tende a ser maior também.

Para suportar essa maior carga de memória, várias heaps serão criadas, uma para cada core lógico, e será gerada uma afinidade entre elas. Com a criação de mais heaps, cada heap usará sua própria thread de GC. O modo Server maximiza o uso de recursos da máquina.

![Server](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mo8pn6qj91j03f06p55t.png)

Em resumo, a escolha do modo de GC mais adequado depende do tipo de aplicativo e das necessidades específicas de desempenho. Os modos Concorrente e Não Concorrente oferecem diferentes abordagens para o gerenciamento de memória, com o primeiro minimizando o tempo de pausa e o segundo interrompendo todas as threads gerenciadas para realizar a coleta. Já os modos Workstation e Server foram projetados para lidar com diferentes tipos de cargas de trabalho, oferecendo respostas mais rápidas para interatividade do usuário ou maximizando o processamento simultâneo de solicitações/requisições. Ao entender as características de cada modo de GC, os desenvolvedores podem otimizar o desempenho de seus aplicativos .NET e proporcionar a melhor experiência para os usuários.