[Dúvida]Variáveis primitivas e de referência

Olá.
Sou novo por aqui, esse é meu primeiro post.
Estou começando a estudar java e me deparei com uma dúvida. Quando eu estava tendo C eu vi que ele trabalha com uma só memória, a Memória Principal(RAM) e agora estudando Java vi que ele(Java) trabalha com duas memórias: Stack e Heap…e estou com dúvidas pra entender como é a organização.
Para dar um exemplo fiz duas classes e uma ilustração para cada variável em qual memória ela ficará alocada.

[code]class Dog
{
int idade;
String nome;

 void latir()
 {
      int i;
      for(i=0;i<idade;i++)
           System.out.println("AU");
 }

}

class Testando
{
public static void main(String Args[])
{
int var;
int[] vetConsultas = new int[3];

      Dog meuDog = new Dog;
      Dog[] vetDog = new Dog[3];
      for(var=0;var<3;var++)
           vetDog[var] = new Dog;

      meuDog.idade = 10;
      meuDog.latir();  
 }

}[/code]

Bem pessoal, eu gostaria que vocês me dissessem se a ilustração que eu fiz esta certa ou errada e se estiver errada me dizer onde. Eu quero muito entender essa parte da matéria, muito mesmo.

abraços.

E quem disse que C não trabalha com stack e heap? Quando você aloca memória usando malloc e calloc, você está alocando memória na heap.
Além disso, quem disse que stack e heap não são memória RAM? :wink:

O stack e o heap são divisões lógicas da mesma memória, a RAM.

O stack é uma área que trabalha como uma pilha. Nela, os dados ficam organizados sequencialmente. O stack tem um tamanho máximo, pré-alocado, e por isso é muito rápido, embora seja um pouco menos econômico. Além das informações de dados, o stack também guarda o ponteiro que indica em que função o seu programa está, em qual estava antes de chegar ali, etc. É ele que permite, por exemplo, que o computador saiba para onde voltar quando uma função termina. Os dados do stack tendem a ser reservados e liberados rapidamente. Por isso ele é usado para armazenar variáveis locais.

O resto da memória RAM é o heap. Ele trabalha a base de requisições. Ou seja, a cada new no seu código, o Java pede ao a JVM mais um pedacinho da RAM. No caso do C++, o new vai pedir diretamente ao sistema operacional. Este, procura um espaço vago e reserva uma porção de memória, para o objeto em questão. Como a memória não é pré-alocada, há um intervalor maior de tempo para localizar um espaço livre, reservar a memória e, depois de usar o objeto, também existe um esforço um pouco maior de liberar essa memória.

Agora, note que ambos, heap e stack, são mesmo parte da memória RAM. A única coisa que muda é o conceito quanto ao seu gerenciamento.

[quote]y
Post 10/07/2009 07:19:10 Assunto: Re:[Dúvida]Variáveis primitivas e de referência.
O stack e o heap são divisões lógicas da mesma memória, a RAM.

O stack é uma área que trabalha como uma pilha. Nela, os dados ficam organizados sequencialmente. O stack tem um tamanho máximo, pré-alocado, e por isso é muito rápido, embora seja um pouco menos econômico. Além das informações de dados, o stack também guarda o ponteiro que indica em que função o seu programa está, em qual estava antes de chegar ali, etc. É ele que permite, por exemplo, que o computador saiba para onde voltar quando uma função termina. Os dados do stack tendem a ser reservados e liberados rapidamente. Por isso ele é usado para armazenar variáveis locais.

O resto da memória RAM é o heap. Ele trabalha a base de requisições. Ou seja, a cada new no seu código, o Java pede ao a JVM mais um pedacinho da RAM. No caso do C++, o new vai pedir diretamente ao sistema operacional. Este, procura um espaço vago e reserva uma porção de memória, para o objeto em questão. Como a memória não é pré-alocada, há um intervalor maior de tempo para localizar um espaço livre, reservar a memória e, depois de usar o objeto, também existe um esforço um pouco maior de liberar essa memória.

Agora, note que ambos, heap e stack, são mesmo parte da memória RAM. A única coisa que muda é o conceito quanto ao seu gerenciamento.[/quote]

e quem define o tamanho da stack seria o SO? tem como eu aumentar o tamanho da stack? se a heap é o resto da Ram pq eu vejo na internet vários tópicos de como aumentar a heap do java ? se é o resto da Ram a solução seria simples, aumentar a Ram :shock:

O tamanho do stack é definido pelo sistema operacional, como você já pôde entender. No Windows, o tamanho do stack, a menos que tenha sido definido em contrário, é de 1 MB.
Se o programa criar várias threads, ele pode definir um tamanho diferente de 1MB para cada thread.
Por exemplo, o Java costuma definir, para cada thread que não seja a thread principal do programa, um stack de 128KBytes apenas, já que ele costuma usar pouco stack.
(Entretanto, pode-se definir para as threads que não são a thread principal do programa, um tamanho diferente, com a opção -Xss. Por exemplo: -Xss1M )

Qual é o truque que o java usa para rodar em qualquer plataforma?

Existe uma aplicação chamada Virtual Machine. Ela é um software que simula uma máquina padrão, rodando num SO padrão. Assim, ela fixa um tamanho de stack próprio, define endianess próprio, etc.

Ela também define um tamanho de heap próprio. Isso impede que aplicações java que criem objetos demais e estourem um certo limite de memória. Quando você inicia a máquina Java pode definir a quantidade de memória RAM que essa máquina ocupará no máximo.

Todos os bytecodes java dão comandos para essa máquina. Esse assembly é interpretado e então convertido para a máquina real.

[quote]O tamanho do stack é definido pelo sistema operacional, como você já pôde entender. No Windows, o tamanho do stack, a menos que tenha sido definido em contrário, é de 1 MB.
Se o programa criar várias threads, ele pode definir um tamanho diferente de 1MB para cada thread.
Por exemplo, o Java costuma definir, para cada thread que não seja a thread principal do programa, um stack de 128KBytes apenas, já que ele costuma usar pouco stack. [/quote]

Entendi. Então voltando para a minha primeira pergunta que realmente é minha dúvida, o desenho está certo ?

Não consigo ver sua figura, estou em um lugar onde o proxy não deixa visualizar a figura. Alguém pode confirmar se a figura dele está certa?

Sim, está certo.

Obrigado.
Desculpe pela demora, Placa de vídeo deu problema.