09 março 2009

SCJP - 03 - Heap and Stack

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?

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:
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.


Creative Commons License
Esta obra está licenciada sob uma Licença Creative Commons.
Comentários
0 Comentários

0 comments:

Postar um comentário

Regras são chatas, mas...

- Seu comentário precisa ter relação com o assunto do post;
- Em hipótese alguma faça propaganda de outros blogs ou sites;
- Não inclua links desnecessários no conteúdo do seu comentário;
- Se quiser deixar sua URL, comente usando a opção OpenID;
- CAIXA ALTA, miguxês ou erros de ortografia não serão tolerados;
- Ofensas pessoais, ameaças e xingamentos não são permitidos;