Bem amigos da... E continuamos a nossa série de postagens sobre Java e a SCJP. Hoje, uma pergunta simples e bastante comum a todos os autodidatas que estudam Java: Que diabos é heap e stack?
Calma, calma... Primemiramente, temos que explicar que heap nada tem a ver com aquele neo-hippie saudosista, eternamente parado nos anos 80. E stack não é aquela peça de madeira usada nas cercas das fazendas. Confesso que eu mesmo nunca havia atentado para a existência e diferença entre essas duas terminologias, apesar de entender o que acontece, já de outras linguagens.
Colé di mermu véio, tá me tiranu é? Ó paí ó...
Calma, calma... Primemiramente, temos que explicar que heap nada tem a ver com aquele neo-hippie saudosista, eternamente parado nos anos 80. E stack não é aquela peça de madeira usada nas cercas das fazendas. Confesso que eu mesmo nunca havia atentado para a existência e diferença entre essas duas terminologias, apesar de entender o que acontece, já de outras linguagens.
Quando você chama um método, o seu código e as variáveis locais (incluindo os parâmetros formais) vão para a stack. Se você criar uma função recursiva sem condições de parada, o que você terá é uma StackOverflowException como resultado, ou seja, a stack cresceu tanto que invade uma área que não lhe pertence.
Também explode um tipo de erro bastante comum em java:
Esse ai acontece quando você instancia objetos demais. Imagine você e seu trabalho de teoria dos grafos. Você precisa implementar adição, remoção e até soma de grafos. Conforme você vai instanciando nós do grafo, eles são mantidos em memória numa área diferente da stack, porque não são variáveis locais. Até que lá pelo 15.000º nó, você vê o erro acima explodir no seu console :)
Em suma, o que você precisa lembrar é:
Ah, mas se eu fizer um código do tipo:
O que vai pra stack e o que vai pra heap?
Primeiro, lembre-se que cachorro é uma variável que aponta para uma área de memória. Depois, lembre-se que, por ser variável, cachorro também precisa ocupar uma área de memória. Logo, cachorro está na stack, e referencia um objeto na heap. Isso sem falar que o código fonte do método metodo também vai para a stack.
Também explode um tipo de erro bastante comum em java:
java.lang.OutOfMemoryError: Java heap space
Esse ai acontece quando você instancia objetos demais. Imagine você e seu trabalho de teoria dos grafos. Você precisa implementar adição, remoção e até soma de grafos. Conforme você vai instanciando nós do grafo, eles são mantidos em memória numa área diferente da stack, porque não são variáveis locais. Até que lá pelo 15.000º nó, você vê o erro acima explodir no seu console :)
Em suma, o que você precisa lembrar é:
- Variáveis de instância e objetos são mantidos na heap.
- Variáveis locais e métodos são mantidos na stack.
Ah, mas se eu fizer um código do tipo:
public void metodo() { ... Cachorro cachorro = new Cachorro(); ... }
O que vai pra stack e o que vai pra heap?
Primeiro, lembre-se que cachorro é uma variável que aponta para uma área de memória. Depois, lembre-se que, por ser variável, cachorro também precisa ocupar uma área de memória. Logo, cachorro está na stack, e referencia um objeto na heap. Isso sem falar que o código fonte do método metodo também vai para a stack.