Estou estudando aqui pelo livro da kathy, já estou um pouco avançado no livro, mas ainda nao consegui entender essa história de pilha e heap. O que acontece exatamente na pilha e o no heap? Quais elementos residem em cada um deles?
Pensava que os objetos residiam no heap, mas na parte de declaração de arrays, ela fala que quando damos um new no array ele vai pra pilha.
Estou um pouco confuso a respeito disso, se alguem puder me ajudar agradeço
Existem duas estruturas de dados onde o Java pode armazenar dados: o stack e o heap.
O stack é usado para três coisas:
Variáveis locais;
Passagem de parâmetros;
Endereço de retorno de métodos.
Para as variáveis locais e os parâmetros, são armazenadas diretamente no stack: os tipos primitivos (por exemplo, em uma máquina Intel ou AMD x86 eles ocupam 4 ou 8 bytes no stack, se não me engano; e em uma máquina de 64 bits sempre ocupam 8 bytes no stack), e as referências para os objetos (que ocupam, cada uma, 4 bytes no stack para máquinas de 32 bits e 8 para máquinas de 64 bits).
O heap serve para armazenar os objetos.
No caso de um array, o que é armazenado no stack é a referência para o array; o array em si é armazenado no heap, mesmo que seja um array de tipos primitivos.
Pode ser que a JVM escolha fazer a seguinte otimização: se o objeto criado for muito pequeno (por exemplo, um java.awt.Point, que contém 2 ints) e tiver tempo de vida muito curto (ou seja, referido por uma variável local de escopo pequeno), esse objeto seja criado diretamente no stack. Mas isso é uma otimização que é apenas “teoricamente possível”; na prática não é feita pela JVM da Sun, se não me engano.
Valeu thingol, isso mesmo que eu tava pensando. Muito obrigado pela explicação.
Mas creio que tem um erro no livro então. Na parte de arrays ele sempre refere pilha a criação de objetos, por isso fiquei tão confuso, cita isso inúmeras vezes. Abaixo vou citar algumas passagens do livro:
[quote] Construir um array significa criar o objeto de array na pilha (onde os objetos residem) - em outras palavras, usar a palavra-chave new com o tipo array. [/quote] pág. 123
[quote] int[] testScores = new int[4]
O código anterior insere um novo objeto na pilha - um objeto de array contendo quatro elementos…
[/quote] pág. 123
Acredito que seja um erro do livro, ou um erro de tradução.
Hum, é que a sua tradução traduz como “pilha” tanto “stack” quanto “heap”.
A tradução literal do primeiro é “pilha” e a literal do segundo é “monte” ou “pilha”. É por isso que eu me atrapalho com os livros em português…
Aproveitando a brecha, ontem estava lendo a parte de GC e no livro diz que o GC atua sobre os elementos que estão no HEAP então se for assim objetos locais não são coletados pelo GC? apenas são liberados da memória quando acaba o método?
Apartir do momento que o metodo acaba os objetos do metodos passam a ficar válido para coleta. Mas isso não quer dizer que vai ser coletado, apenas se torna válido. Mas pode acontecer um caso espécial, se por acaso um método retornar algo e o que for retornado passa a ser referenciado por uma variável fora do método então ele não pode ser coletado.