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:
- Heap
- Pilha
- Código
- 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.