Java Stack e Heap: 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 da 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 de 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 da memória virtual são reservadas em um programa para armazenamento de variáveis ​​​​e instâncias de estruturas e classes. Entretanto, 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 no seguintewing Seções :

  1. montão
  2. Pilha
  3. Code
  4. Estático

Esta divisão da memória é necessária para o seu gerenciamento eficaz.

  • A 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 montão seção contém objetos (também pode conter variáveis ​​de referência).
  • A Estático 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 a 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 heap

Clique plítica de privacidade se o vídeo não estiver acessível

Vamos dar um exemplo para entender isso melhor.

Considere que seu método principal chama o método m1

public void m1{
int x=20
}

Na pilha java, um quadro será criado a partir do método m1.

Pilha e pilha Java

A variável X em m1 também será criada no quadro para m1 na pilha. (Veja imagem abaixo).

Pilha e pilha Java

O método m1 está chamando o método m2. Na pilha java, um novo quadro é criado para m2 no topo do quadro m1.

Pilha e pilha Java

Pilha e pilha Java

As variáveis ​​bec também serão criadas em um quadro m2 em uma pilha.

public void m2(int b){
boolean c;
}

Pilha e pilha Java

O mesmo método m2 está chamando o método m3. Novamente um quadro m3 é criado no topo da pilha (veja a imagem abaixo).

Pilha e pilha Java

Pilha e pilha Java

Agora digamos que nosso método m3 esteja criando um objeto para a classe “Conta”, que possui dois variável de instâncias 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.

Pilha e pilha Java

A variável de referência “ref” será criada em uma pilha java.

Pilha e pilha Java

O operador de atribuição “=” fará uma variável de referência para apontar para o objeto no Heap.

Pilha e pilha Java

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.

Pilha e pilha Java

A pilha do método m3 será eliminada.

Pilha e pilha Java

Como a variável de referência não apontará mais para o objeto no heap, ela seria elegível para coleta de lixo.

Pilha e pilha Java

Assim que o método m2 tiver 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.

Comowise 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.

Pilha e pilha Java

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 chamador 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.