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
Considerando que há uma classe Camisa contendo id, tamanho, preco e cor.
//Classe CamisaIremos 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.
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;
}
}
//Classe do exemploAntes do comando
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;
}
}
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