quarta-feira, 3 de março de 2010

[Java] Comparar como as variáveis de referência de objetos são armazenadas em relação às variáveis primitivas


Há duas áreas distintas onde os dados de um programa são armazenados: stack e heap, então, para poder comparar como as variáveis são armazenadas deve-se primeiro saber as duas maneiras de armazenar variáveis em Java.

Heap

A JVM tem um heap que é compartilhada entre todas as threads. O heap é a área de dados de tempo de execução a partir do qual a memória de todas as instâncias de classes e matrizes é atribuída. Ele também tem variáveis de instância e área de método. Ou seja é uma área reservada para carregar instâncias de objetos e isso significa que embora a method area mantenha as todas as informações de uma classe é aqui que ficam todas as informações persistentes como valores de variáveis.

Coisas que residem no Heap:
  • Variáveis de instância
  • Referências a variáveis de instância
  • Objetos

Stack

Cada thread possui uma stack particular que é criada ao messo tempo da thread. Uma stack Java funciona da mesma maneira que a stack em outras linguagens convencionais como C. Variáveis locais, referências de variáveis locais e invocações de métodos são empilhados e desempilhados da stack.

Coisas que residem na Stack:
  • Variáveis locais
  • Referências de variáveis locais
  • Métodos
Para ficar mais claro, veja o exemplo abaixo:

Considerando que há uma classe Camisa contendo id, tamanho, preco e cor.
//Classe Camisa
public class Camisa {
public int id;
public int tamanho;
public double preco;
public String cor;

public Camisa(int id, int tamanho, double preco, String cor){
this.id = id;
this.tamanho = tamanho;
this.preco = preco;
this.cor = cor;

}
}
Iremos no exemplo criar uma variável de instância (instancia) e uma local (local), bem como duas variáveis de referência (primeiraCamisa e segundaCamisa) para exibir suas diferenças.
//Classe do exemplo
public class TesteHS {
public int instancia;
public static void main(String[] args) {
int local;
local = 10;
Camisa primeiraCamisa = new Camisa(0,40,29.90,"Amarelo");
Camisa segundaCamisa = new Camisa(1,42,49.90,"Rosa");

primeiraCamisa = segundaCamisa;
}
}
Antes do comando primeiraCamisa = segundaCamisa; as variáveis de referência e primitivas encontravam-se da seguinte forma:



Após o comando primeiraCamisa = segundaCamisa;:



Resumindo

variáveis locais (primitivas ou referências) pertencem a stack enquanto que uma variável de instância pertence a um heap. Porém, uma referência de uma variável local na stack aponta para um objeto na heap e o objeto não morre com a morte da referência. Os objetos que estão na heap que não estão a ser utilizados são, eventualmente, destruídos pelo garbage collector de forma a liberar a memória.

Nenhum comentário:

Postar um comentário