Pilha e heap Java: Tutorial de alocação de memória Java

Índice:

Anonim

O que é memória de pilha?

Stack em java é uma seção da 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. Variáveis ​​locais são criadas na pilha.

O que é memória heap?

Heap é uma seção da memória que contém objetos e também pode conter variáveis ​​de referência. 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 separadas em um programa para armazenar as variáveis ​​e instâncias de estruturas e classes. No entanto, a memória não é alocada para 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 forma que o objeto sempre tenha memória alocada no heap.

A alocação de memória Java é dividida nas seguintes seções:

  1. Heap
  2. Pilha
  3. Código
  4. Estático

Essa divisão de memória é necessária para seu gerenciamento eficaz.

  • A seção de código contém seu bytecode .
  • A seção Stack da memória contém métodos, variáveis ​​locais e variáveis ​​de referência.
  • A seção Heap contém objetos (também pode conter variáveis ​​de referência).
  • A seção estática contém dados / métodos estáticos .

Diferença entre variável local e instância

A variável de instância é declarada dentro de uma classe, mas não dentro de um método

class Student{int num; // num is instance variablepublic void showData{}

Variáveis ​​locais são declaradas dentro de um método incluindo argumentos de método .

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 de chamada de método m1

public void m1{int x=20}

Na pilha java, um quadro 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 a 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 ​​bec 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 "Conta", que possui 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}

O extrato 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.

Assim que o método tiver concluído sua execução. O fluxo de controle voltará para o método de chamada. Que neste caso é o método m2.

A pilha do método m3 será eliminada.

Uma vez que a variável de referência não estará mais apontando para o objeto no heap, ela seria elegível para a 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 sua 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 seu objeto, algo parecido com 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.
  • Variáveis ​​locais são criadas na pilha
  • Variáveis ​​de instância são criadas no heap e fazem parte do objeto ao qual pertencem.
  • Variáveis ​​de referência são criadas na pilha.