Stack e Heap em java - entendendo memória além do "funciona"
Quando falamos de Java, stack e heap aparecem o tempo todo – em entrevistas, erros em produção, discussões sobre performance e GC. Mesmo assim, muita gente usa esses conceitos sem realmente entender como a memória é organizada e por que isso importa.
Uma visão geral:
- Stack - memória de execução por thread
- Heap - memória compartilhada de objetos
- Referências - ponte entre stack e heap
O que é a stack
A Stack (pilha) é uma região de memória reservada para armazenar dados locais como valores primitivos e referências de objetos. Utilizando uma estrutura LIFO (Last in First Out), a stack cresce e diminui conforme métodos são chamados e retornam.
Características:
- Cada thread em Java tem uma stack dedicada
- Armazena:
- dados locais
- referência de objetos
- parâmetros de métodos
- Criação e liberação automática
- Muito rápida
ex:
void metodo(){
int x = 10;
}
Nesse caso x é uma variável local, vive apenas durante a execução do método e é removida automaticamente no final.
O que é o Heap
Heap é uma região de memória onde ficam os objetos. Um objeto vive no heap enquanto existir uma referência alcançável apontando para ele. Um objeto pode ter mais de uma referência apontando para ele. Se um objeto ficar sem referência que aponte para ele, então ele é qualificado para o Garbage Collector eliminá-lo para liberar espaço no heap.
Características do heap:
- Compartilhado entre todas as threads
- Armazena somente instâncias de objetos e arrays
- Gerenciado pelo Garbage Collector
- Tempo de vida não é determinístico
ex:
Pessoa p = new Pessoa();
- O objeto pessoa é criado no heap
- p é apenas uma referência para pessoa, e vive na stack
StackOverflowError vs OutOfMemoryError
StackOverflowError é um erro que como o nome já diz, acontece na stack e pode ocorrer com:
- crescimento excessivo da call stack
- recursão sem condição de parada
- stack pequena demais
OutOfMemoryError é um erro que ocorre no heap.
- heap cheio
- objetos retidos
- vazamento de memória
São problemas diferentes com causas diferentes.
Por que entender isso importa?
- Escrita de código mais previsível
- Análise de problemas de performance
- Leitura de logs e stack traces
- Compreensão de Garbage Collector
- Concorrência e segurança de threads
Isso tudo é base para entender o ciclo de vida dos objetos, referências fracas, escape analysis tuning de JVM e muito mais.
Você já teve algum bug ou erro em produção causado por um mal-entendido entre stack e heap?
Conta aí 👇



