


Gerenciamento de memória no C#: stack, heap, value-types e reference-types \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 12 Horas 

 39 Min 

 13 Seg 

   Tempo restante da oferta: 12 39 13 

  [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) Gerenciamento de memória no C#: stack, heap, value-types e reference-types  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

# Gerenciamento de memória no C#: stack, heap, value-types e reference-types

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

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/gerenciamento-mem-ria.jpg)  

Opa pessoal, tudo certinho?

Neste post, eu vou abordar uma dúvida que aparece com uma certa frequência em nosso suporte: o que são, afinal de contas, as benditas memórias *stack* e *heap*? O que são afinal de contas os *value-types* e os *reference-types*?

[  ![C# (C Sharp) Básico](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/csharp.svg)   Curso C# (C Sharp) Básico Conhecer o curso ](https://www.treinaweb.com.br/curso/csharp-basico)

Para entendermos melhor estes conceitos, precisamos também verificar um pouco sobre a criação de objetos e de variáveis primitivas, assim como os conceitos de *value-types* e *reference-types*… Então, vamos lá! o/

O compilador, de maneira geral, divide a memória em duas grandes áreas: a *stack* (uma área bem menor) e a *heap* (uma área bem maior). Seria algo simiar à ilustração abaixo:

![Áreas de memória - compilador .NET](https://treinaweb-suporte.s3.amazonaws.com/imagens/s3FNnAIpDivisao_Memoria.png)

Na configuração padrão do .NET Framework, para que você tenha uma idéia melhor de como a *stack* é muito menor que a *heap*, o tamanho padrão para a memória *stack* é de apenas 1MB!

Ambas trabalham como [pilhas](https://www.treinaweb.com.br/blog/o-que-e-e-como-funciona-a-estrutura-de-dados-pilha/ "pilhas"), porém, a maneira como cada uma provê acesso a seu conteúdo é diferente. A *stack* é bem mais eficiente para localizar as coisas em seu interior com relação a *heap*, mesmo porque ela é bem menor.

As variáveis de alguns tipos de dados leves (tipos primitivos - int, double, bool etc. - e structs) são armazenadas diretamente na stack, a área menor e mais eficiente para localização dos conteúdos. Elas ficam diretamente nessa área justamente por serem tipos de dados que não ocupam tanto espaço na memória. O mais interessante é que o valor que elas contêm também fica junto com elas na *stack*. Ou seja, quando você faz a declaração abaixo:

```csharp
int numero = 3;

```

O compilador armazena essa variável diretamente na memória stack, como na ilustração abaixo:

![Alocação de memória - Value-Type](https://treinaweb-suporte.s3.amazonaws.com/imagens/4jBdIegpAloca%C3%A7%C3%A3o_Mem%C3%B3ria_Value_Type.png)

Perceba que o valor da variável fica junto com a própria variável. Variáveis onde isso acontece são chamadas de *Value-Types*, justamente porque o valor delas fica junto com a própria variável na memória *stack*. Assim, quando você tem o seguinte código:

```csharp
if (numero >= 3)
{
    //...
}

```

O compilador tem acesso direto ao conteúdo, pois ele está juntinho com a própria variável na memória *stack*:

![Acesso à memória: value-type](https://treinaweb-suporte.s3.amazonaws.com/imagens/hkBihNu4Compilador_Acessando_Mem%C3%B3ria_Value_Type.png)

[  ![C# (C Sharp) Intermediário](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/csharp.svg)   Curso C# (C Sharp) Intermediário Conhecer o curso ](https://www.treinaweb.com.br/curso/csharp-intermediario)

Agora, outros tipos de dados ocupam muito mais espaço de memória do que estes tipos leves que são *value-types*. Por isso, eles não podem ser armazenados diretamente na *stack* (caso fossem, rapidamente a memória *stack* seria “estourada”, causando o famoso erro *StackOverflowException*). Sendo assim, estes dados são armazenados na memória *heap*.

Vamos imaginar que você tenha o seguinte código:

```csharp
class Pessoa
{
    public int Id {get; set;}
    public string Nome {get; set;}
}

```

Quando você cria um objeto dessa classe, este objeto será armazenado na memória *heap*:

```csharp
Pessoa minhaPessoa = new Pessoa();

```

![Alocação de memória: reference-type](https://treinaweb-suporte.s3.amazonaws.com/imagens/tpuCNc7AAloca%C3%A7%C3%A3o_Mem%C3%B3ria_Reference_Type.png)

Porém, o compilador não acessa a heap diretamente. Por que ele não acessa? Justamente porque ela é muito grande… Se ele fosse procurar o objeto *minhaPessoa* dentro da *heap*, ele iria demorar um tantinho bom de tempo. O compilador precisaria ter um jeito de acessar pela *stack* (que é rápida pra encontrar as coisas até mesmo por ser bem menor) o que está alocado na *heap* (que é bem maior). Como o compilador contorna isso? Criando uma **referência** dentro da *stack* para o objeto *minhaPessoa*, apontando onde na memória *heap* que este objeto está de fato guardado!

![Processo de referência stack-heap](https://treinaweb-suporte.s3.amazonaws.com/imagens/WAvhFCJoProcesso_Referencia_Stack_Heap.png)

Essa porção de memória que é alocada na *stack* para apontar para uma posição de memória da *heap* é chamada de **ponteiro**. Por isso ele tem esse asterisco (\*) na frente do seu nome.

Repare então que é criada uma **referência** da *stack* para uma determinada posição de memória da *heap*, referência essa guardada por um **ponteiro** na stack. Esse tipo de variável (como no caso da variável *minhaPessoa*, do tipo *Pessoa*) é chamada de *Reference-Type*, já que é necessário uma referência da *stack* para a *heap* para que esta variável seja acessível. Variáveis *reference-type* geralmente precisam que seja chamado o respectivo construtor através da palavra-chave **new**, pois ele é que define que uma porção de memória da *heap* deverá ser utilizada para guardar aquele objeto.

Dessa maneira, quando temos o código abaixo:

```csharp
if (minhaPessoa.Id > 2)
{
    //...
}

```

O compilador faz o acesso ao objeto minhaPessoa através da *stack*, ou seja, através do ponteiro. Esse ponteiro encaminha o compilador para a posição de memória da *heap* que contém de fato o objeto minhaPessoa.

![Acesso à memória: reference-types](https://treinaweb-suporte.s3.amazonaws.com/imagens/BH7wMTvVCompilador_Acessando_Mem%C3%B3ria_Reference_Type.png)

Resumindo:

- **Value-Type**: são tipos leves (como os tipos primitivos e *structs*) que ficam armazenados diretamente na memória *stack*. Os valores das variáveis ficam armazenados juntamente com as próprias variáveis, sendo o acesso ao seu conteúdo feito de maneira direta;
- **Reference-Type**: tipos pesados (objetos criados a partir de classes, etc.) que ficam armazenados na *heap*. Para não sacrificar a performance, é criada uma referência (ponteiro) na *stack* que aponta para qual posição de memória o objeto está armazenado na heap. O acesso é feito via essa referência na *stack*. Sendo assim, o acesso ao conteúdo é indireto, dependendo dessa referência;
- **Stack**: porção de memória pequena onde os *value-types* e os ponteiros ficam;
- **Heap**: porção maior de memória onde os *reference-types* ficam de fato alocados… Para se fazer o acesso a eles, precisamos de um ponteiro na *stack* que indique a posição de memória na *heap* onde o objeto está de fato alocado.

O detalhe interessante é que a imensa maioria das linguagens gerenciadas (como o [Java](https://www.treinaweb.com.br/blog/o-que-e-e-como-comecar-com-javascript/ "Java"), Swift e o próprio [C#](https://www.treinaweb.com.br/blog/o-que-e-e-como-comecar-com-c-sharp/ "C#")) seguem exatamente esta arquitetura de gerenciamento de memória… Isso quer dizer que o que vimos aqui para o C#, pode ser aplicado para outras linguagens com pequenas variações. o/

É isso aí pessoal. Obrigado por terem lido este post! =)

Nos próximos posts, continuaremos as discussões sobre os *value-types* e os *reference-types* e veremos um tipo de dado que foge um pouco da regra: as *strings*.

[  ![Desenvolvedor ASP.NET Full-Stack](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/csharp.svg)   Formação Desenvolvedor ASP.NET Full-Stack Conhecer a formação ](https://www.treinaweb.com.br/formacao/desenvolvedor-aspnet-full-stack)

- [ #.NET ](https://www.treinaweb.com.br/blog/tag/dotnet)
- [ #Arquitetura de Software ](https://www.treinaweb.com.br/blog/tag/arquitetura-de-software)
- [ #C ](https://www.treinaweb.com.br/blog/tag/c)

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/2019/08/15150908/img-java-artigo-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     7 anos atrás

    ##  [ O funcionamento do garbage collector no .NET ](https://www.treinaweb.com.br/blog/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.

     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/2022/10/o-que-e-e-como-comecar-com-golang-400x280.jpg)  [ Guias ](https://www.treinaweb.com.br/blog/categoria/guias) 

     3 anos atrás

    ##  [ Guia da linguagem Go ](https://www.treinaweb.com.br/blog/guia-da-linguagem-go) 

     Nesse guia de Go você aprenderá o necessário para criar os seus primeiros softwares com a linguagem de programação Go. Acesse agora mesmo!

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/o-que-e-e-como-comecar-com-golang-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ O que é e como começar com Go (Golang)? ](https://www.treinaweb.com.br/blog/o-que-e-e-como-comecar-com-golang) 

     Neste artigo vamos ter o contato inicial com a linguagem Go (Golag) e aprender um pouco sobre as suas características e como funciona a sua sintaxe.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/o-que-e-e-como-comecar-com-golang-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Entendendo ponteiros na Golang ](https://www.treinaweb.com.br/blog/entendendo-ponteiros-na-golang) 

     Neste artigo veremos sobre os ponteiros na Golang. Vamos entender o que são ponteiros, quais suas vantagens e desvantagens e como utilizá-los.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/09/09160454/SGBDs-400x280.png)  [ Bancos de Dados ](https://www.treinaweb.com.br/blog/categoria/bancos-de-dados) 

     7 anos atrás

    ##  [ Os principais SGBDs NoSQL ](https://www.treinaweb.com.br/blog/os-principais-sgbds-nosql) 

     Veja neste artigo os principais SGBDs NoSQL e suas principais características.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/01/criando-uma-api-com-spring-data-jpa-e-spring-web-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     5 anos atrás

    ##  [ Criando uma API com Spring Data JPA e Spring Web ](https://www.treinaweb.com.br/blog/criando-uma-api-com-spring-data-jpa-e-spring-web) 

     Neste artigo vamos aprender como criar uma API com persistência de dados utilizando o Spring Web MVC e o Spring Data JPA.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/03/01111116/jogo-feito-400x280.png)  [ Desenvolvimento de Jogos ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-de-jogos) 

     9 anos atrás

    ##  [ Como um jogo digital é criado? ](https://www.treinaweb.com.br/blog/como-um-jogo-digital-e-criado) 

     Veja nesse artigo como um jogo digital é criado e os principais conceitos envolvidos.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/o-que-e-e-como-comecar-com-golang-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     3 anos atrás

    ##  [ Gerenciamento de dependências no Go ](https://www.treinaweb.com.br/blog/gerenciamento-de-dependencias-no-go) 

     Nesse artigo veremos como podemos utilizar o Go Tools para realizar o gerenciamento de dependências no Go.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/08/COMO-SE-PREPARAR-PARA-ENTREVISTA-TECNICA-400x280.png)  [ Carreira ](https://www.treinaweb.com.br/blog/categoria/carreira) 

     4 anos atrás

    ##  [ Como se preparar para entrevistas técnicas ](https://www.treinaweb.com.br/blog/como-se-preparar-para-entrevistas-tecnicas) 

     Geralmente, quando participamos de um processo seletivo para uma vaga relacionada a desenvolvimento, há uma etapa técnica, onde os entrevistadores irão avaliar suas competências técnicas, sua linha de raciocínio lógico e a maneira como você emprega ferramentas e tecnologias para a resolução de problemas. Neste artigo, separamos algumas dicas para que você possa se sair bem nesta etapa.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/04/google-devtools-400x280.jpg)  [ Desenvolvimento Front-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-front-end) 

     4 anos atrás

    ##  [ Google DevTools e suas funcionalidades ](https://www.treinaweb.com.br/blog/google-devtools-e-suas-funcionalidades) 

     Neste artigo, veremos algumas maneiras pelas quais o Google DevTools pode ser usado para melhorar o desenvolvimento dos nossos projetos.

     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  **12h 39min 13s**

- 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
