Pilha e Heap Java:Tutorial de Alocação de Memória Java
O que é memória de pilha?
Stack em java é uma seção de memória que contém métodos, variáveis locais e variáveis de referência. A memória de pilha é sempre referenciada na ordem Last-In-First-Out. As variáveis locais são criadas na pilha.
O que é memória heap?
Heap é uma seção de memória que contém objetos e também pode conter variáveis de referência. As variáveis de instância são criadas no heap
Alocação de memória em Java
Alocação de memória em Java é o processo no qual as seções de memória virtual são reservadas em um programa para armazenar as variáveis e instâncias de estruturas e classes. No entanto, a memória não é alocada a um objeto na declaração, mas apenas uma referência é criada. Para a alocação de memória do objeto, o método new() é usado, de modo que o objeto sempre recebe memória alocada no heap.
A alocação de memória Java é dividida nas seguintes seções:
- Pilha
- Pilha
- Código
- Estático
Essa divisão de memória é necessária para seu gerenciamento eficaz.
- O código seção contém seu bytecode .
- A Pilha seção de memória contém métodos, variáveis locais e variáveis de referência.
- A Pilha seção contém objetos (também pode conter variáveis de referência).
- A Estática seção contém dados/métodos estáticos .
Diferença entre variável local e de instância
Variável de instância é declarado dentro de uma classe, mas não dentro de um método
class Student{ int num; // num is instance variable public void showData{}
Variável local são declarados dentro de um método incluindo método argumentos .
public void sum(int a){ int x = int a + 3; // a , x are local variables; }
Diferença entre pilha e pilha
Clique aqui se o vídeo não estiver acessível
Vamos dar um exemplo para entender isso melhor.
Considere que seu método principal está chamando o método m1
public void m1{ int x=20 }
Na pilha java, um frame será criado a partir do método m1.
A variável X em m1 também será criada no quadro para m1 na pilha. (Veja imagem abaixo).
O método m1 está chamando o método m2. Na pilha java, um novo quadro é criado para m2 no topo do quadro m1.
As variáveis b e c também serão criadas em um quadro m2 em uma pilha.
public void m2(int b){ boolean c; }
O mesmo método m2 está chamando o método m3. Novamente um quadro m3 é criado no topo da pilha (veja a imagem abaixo).
Agora digamos que nosso método m3 está criando um objeto para a classe “Account”, que tem duas instâncias variáveis int p e int q.
Account { Int p; Int q; }
Aqui está o código para o método m3
public void m3(){ Account ref = new Account(); // more code }
A instrução new Account() criará um objeto de conta no heap.
A variável de referência “ref” será criada em uma pilha java.
O operador de atribuição “=" fará uma variável de referência para apontar para o objeto no Heap.
Uma vez que o método tenha concluído sua execução. O fluxo de controle retornará ao método de chamada. Que neste caso é o método m2.
A pilha do método m3 será liberada.
Como a variável de referência não estará mais apontando para o objeto no heap, ela será elegível para coleta de lixo.
Uma vez que o método m2 tenha concluído sua execução. Ele será retirado da pilha e todas as suas variáveis serão liberadas e não estarão mais disponíveis para uso.
Da mesma forma para o método m1.
Eventualmente, o fluxo de controle retornará ao ponto inicial do programa. Que geralmente é o método “principal”.
E se Object tiver uma referência como variável de instância?
public static void main(String args[]) { A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d; //more code }
Neste caso, a variável de referência “filho” será criada no heap, que por sua vez estará apontando para o seu objeto, algo como o diagrama mostrado abaixo.
Resumo:
- Quando um método é chamado, um quadro é criado no topo da pilha.
- Depois que um método conclui a execução, o fluxo de controle retorna ao método de chamada e seu quadro de pilha correspondente é liberado.
- As variáveis locais são criadas na pilha
- As variáveis de instância são criadas no heap e fazem parte do objeto ao qual pertencem.
- As variáveis de referência são criadas na pilha.
Java