Stack e heap in Java

Un programma Java accede a due aree di memoria che svolgono funzioni diverse: lo stack e l'heap.

Stack

Lo stack è l'area di memoria dove sono memorizzate lo stato di esecuzione del programma, gli alias delle variabili locali di ogni metodo, il loro indirizzo di memoria e il loro valore.

Nota. Lo stack ha una dimensione limitata di pochi megabyte. Se viene superata si genera un errore di StackOverflowError.

Lo stack è assegnato dalla macchina virtuale Java (JVM) all'inizio dell'esecuzione del programma.

E' una pila in modalità LIFO (Last Input First Output). Contiene i record di attivazione, ossia le informazioni necessarie per invocare i metodi.

Ogni record di attiazione contiene i parametri, l'oggetto invocato (this), le variabili locali, il valore di ritorno, il punto di ritorno dell'invocazione di un metodo, l'istruzione successiva alla chiamata.

Esempio. Quando un metodo viene invocato (es. main) viene creato un record di attivazione (RDA) nello stack. Quando termina, viene rimosso dallo stack e le variabili locali del metodo sono deallocate dagli indirizzi di memoria. In questo modo tiene traccia delle chiamate nidificate di metodi che chiamano metodi.

Heap

L'heap è l'area di memoria dove sono memorizzati gli oggetti e il loro stato.

E' un'area di memoria dinamica allocata al programma. Può essere modificata dalla macchina virtuale.

Qui sono registrati gli oggetti creati con l'operatore new.

Esempio. Al momento della creazione di un oggetto viene allocata una parte della memoria, restituito il riferimento dell'oggetto e invocato il costruttore della classe per inizializzare l'area di memoria.

Al suo interno i dati sono memorizzati in modo frammentato.

Un esempio pratico

Quando creo un nuovo oggetto, l'identificatore ossia il nome della variabile (alias) viene aggiunto nello stack insieme all'indirizzo di memoria dell'oggetto.

un esempio di funzionamento dello stack e dell'heap

I dati relativi all'oggetto sono, invece, memorizzati nell'indirizzo di memoria nell'heap.

E così via.


 
Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin
knowledge base

Il linguaggio Java