O funcionamento do garbage collector no .NET \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 02 Horas 

 43 Min 

 23 Seg 

   Tempo restante da oferta: 02 43 23 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) O funcionamento do garbage collector no .NET  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

# O funcionamento do garbage collector no .NET

 Neste artigo, vamos compreender o funcionamento básico do garbage collector dentro da CLR em uma aplicação .NET.

 [ Cleber Campomori ](https://www.treinaweb.com.br/blog/autor/cleber-campomori) 7 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/08/15150908/img-java-artigo.png)  

A CLR - o ambiente de execução do .NET Framework - é um ambiente gerenciado e, por isso, não precisamos nos preocupar diretamente com questões relacionadas a liberação de memória. Isso é possível por causa de um componente importantíssimo da CLR: trata-se do *garbage collector*. O *garbage collector* tem exatamente a responsabilidade de lidar com a liberação da memória associada a uma variável e/ou objeto quando este não é mais utilizado em nenhum ponto do nosso código.

Entender como o *garbage collector* funciona no .NET é essencial para que possamos entender como um todo como a CLR funciona. Questões relacionadas ao *garbage collector* também são muito úteis quando precisamos escrever código de alta performance para aplicações que exigem respostas próximas ao *real-time* “de verdade”. Por isso, vamos entender como o *garbage collector* funciona na CLR.

### Como funciona o gerenciamento de memória no .NET?

[![](https://i.loli.net/2019/08/01/5d41bd4b9e15728750.jpg)](https://i.loli.net/2019/08/01/5d41bd4b9e15728750.jpg)

No artigo [C# Gerenciamento de memória no C#: stack, heap, value-types e reference-types](https://www.treinaweb.com.br/blog/gerenciamento-de-memoria-no-c-stack-heap-value-types-e-reference-types/ "C# Gerenciamento de memória no C#: stack, heap, value-types e reference-types") que escrevi aqui para o blog da TreinaWeb, apresentei as duas principais divisões da área de memória durante a execução de uma aplicação .NET: a *stack*, para os *value-types*; e a *heap*, para os *reference-types*. Dependendo do tipo de “dado” que você aloca em uma variável, o dado pode ser deslocado ou para a *stack* - se estivermos falando de *structs* - ou para a *heap* - se estivermos falando de tipos ditos “complexos”, como objetos.

[  ![Desenvolvedor C# Sênior](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/csharp.svg)   Formação Desenvolvedor C# Sênior Conhecer a formação ](https://www.treinaweb.com.br/formacao/desenvolvedor-c-senior)

Quando falamos sobre o *garbage collector*, é importante frisar que este atua organizando a memória na *heap*, embora ele utilize as referências guardadas na *stack* para determinar o que ainda está em uso ou não. Os objetos que são alocados na *heap* acabam sendo divididos em três grupos, também chamados de *gerações*:

- **geração 0**: é a primeira geração onde um objeto é alocado. Assim que algo é alocado na *heap*,o objeto alocado é colocado imediatamente como sendo parte da geração 0;
- **geração 1**: trata-se de uma geração de transição, onde objetos que são utilizados de maneira “média” são alocados;
- **geração 2**: é uma geração que contém objetos que são utilizados por mais tempo e que, por isso, precisam existir na memória por um tempo maior.

O que o *garbage collector* faz basicamente é migrar os objetos entre estas três áreas distintas e eliminar as áreas de memória associadas a objetos que não são mais utilizados.

### O ciclo de trabalho do *garbage collector* na *heap*

[![](https://i.loli.net/2019/08/01/5d41bdc38a89025860.jpg)](https://i.loli.net/2019/08/01/5d41bdc38a89025860.jpg)

O *garbage collector* trabalha em ciclos de análise sobre as gerações que existem na *heap*. O que diferencia o funcionamento do *garbage collector* sobre as gerações é a peridiocidade da inspeção: a *geração 0*, por ser menor na maioria das vezes, sofre análises do *garbage collector* mais frequentes do que as gerações 1 e 2 por exemplo. Nestas análises, o que o *garbage collector* faz é verificar se os integrantes das gerações estão ainda sendo utilizados e, caso algum integrante não seja mais necessário, este é removido, fazendo com que a área de memória correspondente seja liberada e fique disponível para novas alocações.

É importante notar também que os ciclos de análise ocorrem na geração que é alvo do ciclo e nas gerações anteriores. Por exemplo: se o *garbage collector* precisa analisar a geração 0, somente ela é analisada. Se o *garbage collector* precisa analisar a geração 1, as gerações 1 e 0 são analisadas. Se o *garbage collector* precisa analisar a geração 2, as gerações 2, 1 e 0 são analisadas. Em decorrência desse funcionamento, o ciclo de análise na geração 2 ganha o nome de *coleta completa*, pois todas as gerações acabam sendo analisadas.

Essa análise do *garbage collector* pode ocorrer em situações pré-definidas:

- Quando o sistema operacional informa que possui pouca memória física disponível;
- O tamanho das gerações é estourado;
- O método `GC.Collect()` é invocado, o que caracteriza uma chamada explícita para o processo de análise do *garbage collector* dentro da aplicação.

### Promoções de geração em objetos

[![](https://i.loli.net/2019/08/01/5d41be281b80261714.jpg)](https://i.loli.net/2019/08/01/5d41be281b80261714.jpg)

Os objetos são inicialmente alocados na geração 0 - portanto, na geração que sofre coletas mais rápidas - porque a CLR supõe que estes objetos não serão mais necessários muito rapidamente, o que faria com que estes objetos fossem removidos rapidamente da memória. E isso é verdade para a maioria dos cenários. Porém, alguns objetos podem precisar sobreviver por mais de um ciclo de análise do *garbage collector*… Quando o *garbage collector* detecta um objeto que precisa sobreviver por mais tempo na memória do que o esperado para a geração onde ele se encontra, o objeto sofre o que é chamado de *promoção*: o objeto é deslocado para a geração superior, sofrendo ciclos mais espaçados de análise do *garbage collector*. Por exemplo: se um objeto que está na geração 0 sobrevive a um ciclo de análise, o mesmo é deslocado para a geração 1. Se um objeto sobrevive a um ciclo de análise sob a geração 1, o mesmo é deslocado para a geração 2, sofrendo a análise do *garbage collector* de maneira mais espaçada ainda.

Esse processo de promoção pode tornar a gerência de memória um processo muito lento, já que esse deslocamento de gerações pode exigir uma quantidade de processamento computacional considerável, dependendo da quantidade de objetos alocados… Por isso, o CLR sempre está “supervisionando” o trabalho do *garbage collector*. Se o *garbage collector* passa a detectar que a taxa de sobrevivência de objetos em uma determinada geração é muito alta, a CLR aumenta o tamanho da geração em questão, evitando que as gerações tenham seu tamanho estourado frequentemente. A CLR sempre tenta equilibrar os ciclos de análise do *garbage collector* e o tamanho das gerações - as gerações também não podem ser sempre expandidas, pois isso deixaria o sistema operacional sem memória em um curto espaço de tempo.

### Áreas efêmeras

O CLR e o *garbage collector* supõe que os objetos que fazem parte das gerações 0 e 1 terão um ciclo de vida muito curto, sendo eliminados rapidamente da memória. Por isso, estas gerações também são chamadas de *gerações efêmeras*.

As gerações também costumam ser agrupadas em segmentos de memória, segmentos estes que são gerenciados pelo *garbage collector*. Segmentos que possuem as gerações 0 e 1 também são chamados de *segmentos efêmeros*.

O *garbage collector* também realiza a manipulação destes segmentos. Os segmentos recém-criados também são definidos como segmentos efêmeros. Quando o *garbage collector* cria mais um novo segmento, o segmento que antes era efêmero deixa de ter essa característica, passando a ser considerado um segmento de geração 2 (a geração com objetos que sobrevivem por mais tempo). O novo segmento passa a ser considerado neste momento como o segmento efêmero.

No próximo artigo, iremos analisar em detalhes como o *garbage collector* realiza o trabalho de remoção e promoção de objetos entre os segmentos gerenciados pelo *garbage collector*.

- [ #.NET ](https://www.treinaweb.com.br/blog/tag/dotnet)
- [ #Memória ](https://www.treinaweb.com.br/blog/tag/memoria)
- [ #CLR ](https://www.treinaweb.com.br/blog/tag/clr)
- [ #Garbage Collector ](https://www.treinaweb.com.br/blog/tag/garbage-collector)

Autor

 ![Cleber Campomori](//secure.gravatar.com/avatar/c659c6a58478cad5b7751370ba94205f?d=mm)

## Cleber Campomori

 Líder de Conteúdo/Inovação. Pós-graduado em Projeto e Desenvolvimento de Aplicações Web. Certificado Microsoft MCSD (Web). 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/cleber-campomori)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/07/15150948/img-java-artigo-400x280.png)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     7 anos atrás

    ##  [ Java: new generation, old generation e permanent generation na JVM ](https://www.treinaweb.com.br/blog/java-new-generation-old-generation-e-permanent-generation-na-jvm) 

     Neste artigo, abordaremos a new generation, a old generation e a permanent generation na JVM, compreendendo a função de cada uma destas áreas.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/03/04195644/php-background-400x280.jpg)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Estrutura interna de valor, referências e gerenciamento de memória no PHP ](https://www.treinaweb.com.br/blog/estrutura-interna-de-valor-referencias-e-gerenciamento-de-memoria-no-php) 

     Valores em PHP possuem que semântica? De valor ou de referência? Objetos são passados por referência? Essas são algumas das questões que esse artigo se propõe a responder.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/01/19114832/C-SHARP-7-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     9 anos atrás

    ##  [ Generalizando tipos de retornos assíncronos no C# 7.0 ](https://www.treinaweb.com.br/blog/generalizando-tipos-de-retornos-assincronos-no-csharp-7) 

     Aprenda a criar um tipo que pode ser retornado pelos métodos assíncronos do C#.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/05/closure-400x280.jpg)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     4 anos atrás

    ##  [ O que é Closure ](https://www.treinaweb.com.br/blog/o-que-e-closure) 

     Neste artigo, veremos o que é Closure e por que é tão importante entendê-lo para saber o que acontece por debaixo dos panos na linguagem.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/o-que-e-wordpress-e-como-instalar-na-sua-maquina-400x280.png)  [ WordPress ](https://www.treinaweb.com.br/blog/categoria/wordpress) 

     6 anos atrás

    ##  [ O que é Wordpress e como instalar na sua máquina ](https://www.treinaweb.com.br/blog/o-que-e-wordpress-e-como-instalar-na-sua-maquina) 

     Saiba o que é o WordPress e aprenda a instalar localmente em sua máquina.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/jpa-400x280.jpg)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     10 anos atrás

    ##  [ Entendendo o método merge do JPA ](https://www.treinaweb.com.br/blog/entendendo-o-metodo-merge-do-jpa) 

     Aprenda como o método merge do JPA funciona e utilize-o corretamente em seu projeto.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/05/16092331/DJANGO-REDIS-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     8 anos atrás

    ##  [ Utilizando o Redis como Cache em um projeto Django ](https://www.treinaweb.com.br/blog/utilizando-o-redis-como-cache-em-um-projeto-django) 

     Neste artigo veremos como utilizar o Redis como Cache de aplicações Django.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/11/12104935/VIRTUALENV-400x280.png)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     8 anos atrás

    ##  [ Criando ambientes virtuais para projetos Python com o Virtualenv ](https://www.treinaweb.com.br/blog/criando-ambientes-virtuais-para-projetos-python-com-o-virtualenv) 

     Neste artigo veremos como criar e utilizar as virtualenvs para isolar nossos ambientes de desenvolvimento python e, assim, instalar diferentes versões de uma mesma biblioteca.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/10/05132043/capa-kubernetes-400x280.png)  [ DevOps ](https://www.treinaweb.com.br/blog/categoria/devops) 

     8 anos atrás

    ##  [ No final das contas: o que é o Kubernetes? ](https://www.treinaweb.com.br/blog/no-final-das-contas-o-que-e-o-kubernetes) 

     Você sabe o que vem a ser o Kubernetes e como ele pode nos ajudar? Confira neste artigo.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/algoritmos-400x280.jpg)  [ Algoritmos ](https://www.treinaweb.com.br/blog/categoria/algoritmos) 

     10 anos atrás

    ##  [ Conheça os principais algoritmos de ordenação ](https://www.treinaweb.com.br/blog/conheca-os-principais-algoritmos-de-ordenacao) 

     A ordenação de registros consiste em organizar os dados em ordem crescente ou decrescente. Veja os principais métodos de ordenação e a teoria por trás deles.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/07/SEO-WORDPRESS-YOAST-400x280.png)  [ CMS's e E-commerce ](https://www.treinaweb.com.br/blog/categoria/cmss-e-e-commerce) 

     6 anos atrás

    ##  [ Otimizando conteúdo para SEO no Wordpress com Yoast ](https://www.treinaweb.com.br/blog/otimizando-conteudo-para-seo-no-wordpress-com-yoast) 

     Aprenda a otimizar o SEO de suas páginas e posts utilizando o Plugin Yoast SEO para Wordpress e eleve os resultados do seu blog!

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/05/01125223/react-php-imagem-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     8 anos atrás

    ##  [ Introdução à programação assíncrona em PHP usando o ReactPHP ](https://www.treinaweb.com.br/blog/introducao-a-programacao-assincrona-em-php-usando-o-reactphp) 

     Uma introdução à programação assíncrona com PHP e uso básico dos componentes do ReactPHP.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **02h 43min 23s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
