Certificação: Pilha e Heap

10 respostas
Jonatas

Estou com algumas dúvidas do livro da Kathy …
Certificação: Pilha e Heap

Na página 102 fala que …

  • As variáveis de instâncias e os objetos residem no HEAP
  • As variáveis locais residem na PILHA

Já na página 122 fala que …
Em Java, os arrays são objetos … o array propriamente dito sempre será um objeto da pilha …

Na página 123 fala que …
Construir um array significa criar o objeto de array na pilha (onde todos os objetos residem) …

Em todos os desenhos como exemplo, o livro descreve os arrays no Heap …
Afinal, o que fica no HEAP??? E o que fica na PILHA???
Pois agora já não sei mais de nada …

10 Respostas

ramilani12

A grande diferença que os objetos residem na HEAP e tipos primitvos int , float , char e etc residem na Pilha (Stack)

Jonatas

ramilani12,
muito obrigado por sua atenção …
mas ainda tenho uma dúvida: e os arrays onde residem???

Giulliano

Na verdade o que reside no heap são as varíaveis de instância sendo ela primitiva ou não…

e na pilha ficam as varíaveis locais…ou seja : varíaveis de métodos, por exemplo.

public class dog{

int a; //fica no heap

public void auf(){

Dog g = new Dog();   ///isso ficara na pilha quando o método acabar ela morre.

}

}
ramilani12
Giulliano:
ramilani12:
A grande diferença que os objetos residem na HEAP e tipos primitvos int , float , char e etc residem na Pilha (Stack)

Na verdade o que reside no heap são as varíaveis de instância sendo ela primitiva ou não...

e na pilha ficam as varíaveis locais...ou seja : varíaveis de métodos, por exemplo.

public class dog{

int a; //fica no heap

public void auf(){

Dog g = new Dog();   ///isso ficara na pilha quando o método acabar ela morre.

}

}

Não é o contrário ?
Veja esse link Thinking in Java
[url]http://www.hwn.com.br/pej/tij2pej/PEJ303.htm[/url]
Na seção: Criação de objetos, uso e tempo de vida

fec

Amigo a tradução está errada:
Dá uma olhada:
Constructing an array means creating the array object on the heap (where all objects
live)

Espero que tenha tirado sua duvida agora!!

ramilani12

JohnJohn:
ramilani12,
muito obrigado por sua atenção …
mas ainda tenho uma dúvida: e os arrays onde residem???

Se vc criar um Array de Tipos primitivos ele ficara na pilha mas como objeto de referencia , não tenho muita certeza disso estou me basendo nesse artigo escrito pelo Dejan Jelovic que ele compara a performance de um programa Java e C++

int [] a = new int [3];

Fonte: http://www.jelovic.com/articles/why_java_is_slow.htm

fec

Mesmo assim arrays serão criados no heap.
Mesmo se for arrays de primitivos continuará sendo um objeto, pois não existe um array primitivo.

Valew!

LPJava

olha para entender isso: você poe assim, todas minhas variaveis locais ou seja declarda dentro de um método ou de um bloco, ela pertence a uma pilha, que pilha é essa? uma pilha de chamadas.. que apos a conclusão de cada chamada, essas variaveis sao destruidas. exemplo:

class Pilha{
void massa(){
int z=10;
pizza();
}
void pizza(){}

public static void main(String[]arg){
 Pilha p = new Pilha();
 p.massa();
}
}

vamos observar o codigo agora, você tem essa pilha: main-->massa-->pizza. certo? um metodo chamado o outro.. qdo pizza concluir sua tarefa, ele volta para o metodo chamador quem é? massa, ai ele conclui a sua tarefa e volta para quem? Main e a variavel de massa é local ne? entao ela foi destruida apos o metodo ter concluido e agora o metodo está em main que terminou sua execucao e seu programa parou de rodar.. simples ne? então por isso que é uma variavel de pilha, pois ela está em uma pilha de chamadas.

E heap? heap é um local aonde está as variaveis de instancia? mais para vc saber o que é heap tem q se lembrar que variaveis de instancia pertence a um objeto, entao no heap eu posso ter varios objetos que referencia aquela variavel de instancia porem com valores distintos. Todo e qualquer objeto que vc dar new ele vai para o heap.. lembre-se que em array vc dar new.. entao ele é um objeto apesar de vc fazer isso
int array......
ele nao é um tipo primitivo.. ele armazena elementos de tipos primitivos... mais no fundo é um objeto...

Para o exame você souber diferenciar a existencia de uma variavel local e uma variavel de instancia tá de bom tamanho.. a parte teórica nao cai.. mais vc precisa saber para identificar os erros de compilação q tem muita questao desse tipo que nem compila. Ex.: Acessar uma variavel local, fora do seu escopo..

espero ter ajudado...

P.S.: O GUJ ta legal no novo layout e funcionalidades.. Parabéns! aos responsáveis :D

Jonatas

fec:
Amigo a tradução está errada:
Dá uma olhada:
Constructing an array means creating the array object on the heap (where all objects
live)

Espero que tenha tirado sua duvida agora!!

Cara, creio que essa resposta é a mais cabível …
Boa sorte ao seu Fortaleza … eheheheh (São Paulo rumo ao penta)
Muito obrigado!!!

R

Resumindo,

Heap: qualquer variável de instância (seja primitiva ou objeto) e qualquer Objeto (inclusive array, de primitivo ou não, pois qualquer array é um Object) declarado em qualquer ponto do programa.
Pilha: variáveis locais ou “de método” e valores de tipos primitivos. Note qu são apenas as variáveis que ficam na pilha e não os objetos.

Ex.:

public class Class {
   //a variável heapDog é de instância e, portanto, será armazenada no heap 
   //e o objeto Dog criado será armazenado no heap
   Dog heapDog = new Dog();

   //a variável heapDogs é de instância e, portanto, será armazenada no heap 
   //e o array Dog[] é um objeto e, portanto, será armazenado no heap
   Dog[] heapDogs = new Dog[]{ new Dog(). new Dog(). new Dog() };

   public void latir() {
      //a variável stackDog é local e, portanto, será armazenada na pilha. 
      //Mas o objeto Dog criado será armazenado no heap.
      Dog stackDog = new Dog();
      System.out...(stackDog + " está latindo...") ;
   }

   public void realizarSurubaCanina() {
      //a variável stackDogs é local e, portanto, será armazenada na pilha. 
      //Mas o array Dog[] criado é um objeto e, portanto, será armazenado no heap.
      Dog[] stackDogs = new Dog[]{ new Dog(). new Dog(). new Dog() };
      System.out...("Joguem água gelada nos " + stackDogs + " porque o bicho tá pegando...");
   }
}

[]'s

Criado 23 de agosto de 2007
Ultima resposta 23 de ago. de 2007
Respostas 10
Participantes 6