Java Stack and Heap: Tutorial de alocare a memoriei Java

Cuprins:

Anonim

Ce este memoria stivă?

Stiva în java este o secțiune de memorie care conține metode, variabile locale și variabile de referință. Memoria stivă este întotdeauna menționată în ordinea Last-In-First-Out. Variabilele locale sunt create în stivă.

Ce este memoria Heap?

Heap este o secțiune a memoriei care conține obiecte și poate conține, de asemenea, variabile de referință. Variabilele de instanță sunt create în heap

Alocarea memoriei în Java

Alocarea memoriei în Java este procesul în care secțiunile de memorie virtuală sunt puse deoparte într-un program pentru stocarea variabilelor și instanțelor structurilor și claselor. Cu toate acestea, memoria nu este alocată unui obiect la declarație, ci se creează doar o referință. Pentru alocarea memoriei obiectului, se folosește metoda new (), astfel încât obiectului i se alocă întotdeauna memorie pe heap.

Alocarea memoriei Java este împărțită în următoarele secțiuni:

  1. Morman
  2. Grămadă
  3. Cod
  4. Static

Această diviziune a memoriei este necesară pentru gestionarea sa eficientă.

  • Secțiunea de cod conține codul tău de octet .
  • Secțiunea Stack a memoriei conține metode, variabile locale și variabile de referință.
  • Secțiunea Heap conține obiecte (poate conține și variabile de referință).
  • Secțiunea static conține date / metode statice .

Diferența dintre variabila locală și instanță

Variabila de instanță este declarată în interiorul unei clase, dar nu în cadrul unei metode

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

Variabila locală este declarată în cadrul unei metode care include argumente ale metodei .

public void sum(int a){int x = int a + 3;// a , x are local variables;}

Diferența dintre Stack și Heap


Faceți clic aici dacă videoclipul nu este accesibil

Să luăm un exemplu pentru a înțelege mai bine acest lucru.

Luați în considerare că metoda dvs. principală apelând metoda m1

public void m1{int x=20}

În stiva java, va fi creat un cadru din metoda m1.

Variabila X din m1 va fi creată și în cadrul pentru m1 din stivă. (Vezi imaginea de mai jos).

Metoda m1 apelează metoda m2. În java stivei, este creat un nou cadru pentru m2 pe partea de sus a cadrului m1.

Variabilele b și c vor fi, de asemenea, create într-un cadru m2 într-o stivă.

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

Aceeași metodă m2 apelează metoda m3. Din nou, un cadru m3 este creat în partea de sus a stivei (a se vedea imaginea de mai jos).

Acum, să presupunem că metoda noastră m3 creează un obiect pentru clasa "Cont", care are două instanțe variabile int p și int q.

Account {Int p;Int q;}

Iată codul pentru metoda m3

public void m3(){Account ref = new Account();// more code}

Declarația Cont nou () va crea un obiect de cont în heap.

Variabila de referință „ref” va fi creată într-un java stivă.

Operatorul de atribuire va face o variabilă de referință pentru a indica obiectul din Heap.

Odată ce metoda și-a finalizat execuția. Fluxul de control va reveni la metoda de apelare. Ceea ce în acest caz este metoda m2.

Stiva din metoda m3 va fi eliminată.

Deoarece variabila de referință nu va mai indica spre obiectul din grămadă, va fi eligibilă pentru colectarea gunoiului.

Odată ce metoda m2 și-a finalizat execuția. Acesta va fi scos din stivă și toată variabila sa va fi spălată și nu va mai fi disponibilă pentru utilizare.

La fel și pentru metoda m1.

În cele din urmă, fluxul de control va reveni la punctul de pornire al programului. Care, de obicei, este metoda „principală”.

Ce se întâmplă dacă Object are o referință ca variabilă de instanță?

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 }

În acest caz, variabila de referință „copil” va fi creată în heap, care, la rândul său, va indica obiectul său, ceva asemănător cu diagrama prezentată mai jos.

Rezumat:

  • Când se apelează o metodă, se creează un cadru în partea de sus a stivei.
  • Odată ce o metodă a finalizat execuția, fluxul de control revine la metoda apelantă și cadrul corespunzător al stivei este spălat.
  • Variabilele locale sunt create în stivă
  • Variabilele de instanță sunt create în heap și fac parte din obiectul căruia îi aparțin.
  • Variabilele de referință sunt create în stivă.