Stack e heap Java: tutorial sull'allocazione della memoria Java

Sommario:

Anonim

Cos'è la memoria stack?

Stack in java è una sezione di memoria che contiene metodi, variabili locali e variabili di riferimento. Si fa sempre riferimento alla memoria dello stack nell'ordine Last-In-First-Out. Le variabili locali vengono create nello stack.

Cos'è la memoria heap?

L'heap è una sezione di memoria che contiene oggetti e può anche contenere variabili di riferimento. Le variabili di istanza vengono create nell'heap

Allocazione della memoria in Java

L'allocazione della memoria in Java è il processo in cui le sezioni di memoria virtuale vengono messe da parte in un programma per memorizzare le variabili e le istanze di strutture e classi. Tuttavia, la memoria non viene allocata a un oggetto al momento della dichiarazione, ma viene creato solo un riferimento. Per l'allocazione di memoria dell'oggetto, viene utilizzato il metodo new (), quindi all'oggetto viene sempre allocata memoria nell'heap.

L'allocazione della memoria Java è suddivisa nelle seguenti sezioni:

  1. Mucchio
  2. Pila
  3. Codice
  4. Statico

Questa divisione della memoria è necessaria per la sua gestione efficace.

  • La sezione del codice contiene il tuo bytecode .
  • La sezione Stack di memoria contiene metodi, variabili locali e variabili di riferimento.
  • La sezione Heap contiene oggetti (può contenere anche variabili di riferimento).
  • La sezione Statico contiene dati / metodi statici .

Differenza tra variabile locale e istanza

La variabile di istanza è dichiarata all'interno di una classe ma non all'interno di un metodo

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

Le variabili locali vengono dichiarate all'interno di un metodo inclusi gli argomenti del metodo .

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

Differenza tra Stack e Heap


Fare clic qui se il video non è accessibile

Facciamo un esempio per capirlo meglio.

Considera che il tuo metodo principale che chiama il metodo m1

public void m1{int x=20}

Nello stack java, verrà creato un frame dal metodo m1.

La variabile X in m1 verrà creata anche nel frame per m1 nello stack. (Vedi immagine sotto).

Il metodo m1 chiama il metodo m2. Nello stack java, viene creato un nuovo frame per m2 sopra il frame m1.

Le variabili bec verranno create anche in un frame m2 in una pila.

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

Lo stesso metodo m2 chiama il metodo m3. Anche in questo caso viene creato un frame m3 in cima alla pila (vedi immagine sotto).

Supponiamo ora che il nostro metodo m3 crei un oggetto per la classe "Account", che ha due istanze variabili int p e int q.

Account {Int p;Int q;}

Ecco il codice per il metodo m3

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

L'istruzione new Account () creerà un oggetto di account in heap.

La variabile di riferimento "ref" verrà creata in uno stack java.

L'operatore di assegnazione farà in modo che una variabile di riferimento punti all'oggetto nell'Heap.

Una volta che il metodo ha completato la sua esecuzione. Il flusso di controllo tornerà al metodo chiamante. Che in questo caso è il metodo m2.

La pila del metodo m3 verrà eliminata.

Poiché la variabile di riferimento non punta più all'oggetto nell'heap, sarebbe idonea per la garbage collection.

Una volta che il metodo m2 ha completato la sua esecuzione. Verrà estratto dallo stack e tutte le sue variabili verranno scaricate e non saranno più disponibili per l'uso.

Allo stesso modo per il metodo m1.

Alla fine, il flusso di controllo tornerà al punto di inizio del programma. Che di solito è il metodo "principale".

Cosa succede se Object ha un riferimento come variabile di istanza?

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 }

In questo caso, la variabile di riferimento "figlio" verrà creata in heap, che a sua volta punterà al suo oggetto, qualcosa come il diagramma mostrato sotto.

Sommario:

  • Quando viene chiamato un metodo, viene creato un frame in cima allo stack.
  • Una volta completata l'esecuzione di un metodo, il flusso di controllo ritorna al metodo chiamante e il frame dello stack corrispondente viene scaricato.
  • Le variabili locali vengono create nello stack
  • Le variabili di istanza vengono create nell'heap e fanno parte dell'oggetto a cui appartengono.
  • Le variabili di riferimento vengono create nello stack.