Pular para o conteúdo
.NETStack, heap e boxing
Módulo 01Fundamentos da Plataforma e da Linguagem

Stack, heap e boxing

iniciante 22 min de leitura·Atualizado · .NET 9
Resumo

Tipos de valor tendem a viver na stack (rápida, automática); objetos de referência vivem no heap (gerenciado pelo GC). Boxing é embrulhar um value type em um objeto no heap — barato de errar, caro em desempenho.

1. Objetivos de Aprendizagem#

  • Entender o papel de stack e heap.
  • Reconhecer o que é boxing/unboxing e seu custo.
  • Ter noção de como o Garbage Collector atua.

2. Pré-requisitos#

  • Struct vs class (tópico 4.1).

3. Conceito#

  • Stack: região de memória rápida, organizada por chamadas de método. Variáveis locais de tipos de valor costumam ficar aqui; são liberadas ao sair do método.
  • Heap: região onde vivem os objetos de referência. É gerenciada pelo Garbage Collector (GC), que libera automaticamente o que não é mais referenciado.
  • Boxing: quando um value type (int, struct) é convertido para object (ou uma interface), o runtime o embrulha num objeto no heap. Unboxing é o caminho de volta.

O porquê de se importar: boxing em laços quentes gera lixo (pressão no GC) e custa desempenho. Generics existem em parte para evitá-lo.

4. Mão na Massa#

4.1. Setup#

Shell
dotnet new console -n Catalog.Memoria
cd Catalog.Memoria

4.2. Implementação Passo a Passo#

  1. Boxing implícito (evite):
C#
int numero = 42;
object caixa = numero;   // BOXING: cópia vai para o heap
int devolta = (int)caixa; // UNBOXING
  1. Coleção não genérica força boxing (não use):
C#
// Evitar: System.Collections.ArrayList faz boxing de cada int
var lista = new System.Collections.Generic.List<int>(); // sem boxing
lista.Add(1);
  1. string.Format/interpolação também podem "boxar" value types passados como object.

4.3. Executando#

Shell
dotnet run

5. Exemplo Completo#

Usar List<int> (genérico) em vez de ArrayList (não genérico) elimina boxing de cada elemento — mesma lógica, muito menos lixo no heap.

6. Boas Práticas e Armadilhas#

FaçaEvite
Usar coleções genéricas (List)Coleções não genéricas (ArrayList) que fazem boxing
Deixar o GC trabalhar; escrever código limpoMicro-otimizar memória sem medir
Nota

o modelo "value = stack, reference = heap" é uma simplificação didática. Um value type dentro de um objeto de referência mora no heap junto com ele. Para o dia a dia, o essencial é entender cópia vs referência e evitar boxing desnecessário.

7. Segurança e Produção#

  • Alocações excessivas no heap aumentam a frequência de coletas do GC e podem causar picos de latência em serviços de alta carga. Meça com ferramentas de profiling antes de otimizar.

8. Exercícios#

  • Fácil: identifique o boxing no exemplo e explique-o.
  • Médio: troque um ArrayList por List<int> e descreva o ganho.
  • Desafio: pesquise o que é o GC geracional (gen 0/1/2) e resuma em 3 linhas.

9. Resumo#

Value types tendem à stack; objetos vivem no heap sob o GC. Boxing embrulha value types no heap e custa desempenho — coleções genéricas o evitam.

10. Próximos Passos#

A seguir, lidar com ausência de valor: nullable.

11. Referências#

04-02 — Stack, heap e boxing | Curso ASP.NET Core