Nella Java Virtual Machine, esistono due (+1) tipi di memoria:
- lo stack dove vengono caricate le variabili locali, i riferimenti agli oggetti;
- lo heap, dove vanno le aree di memoria allocate per la creazione dinamica;
- la zona speciale di memoria nativa (gestita dal sistema operativo stesso in automatico) detta metaspace, che memorizza i campi static.
Cosa succede alla creazione di un oggetto?
-
Dichiarazione Viene dichiarata una variabile di riferimento all’oggetto. In questa fase viene allocata una porzione di memoria nello stack, che contiene un valore inizialmente indefinito (o
nullse viene assegnato esplicitamente). -
Creazione (allocazione) L’oggetto vero e proprio viene creato tramite l’istruzione
new. Questo comporta:- Allocazione di memoria nello heap, dove viene creata un’istanza della classe.
- Inizializzazione implicita dei campi con valori di default:
0per i numeri,falseper i booleani,nullper i riferimenti, ecc.
-
Assegnazione del riferimento L’indirizzo di memoria dell’oggetto nello heap viene memorizzato nella variabile nello stack, creando un riferimento dallo stack all’heap.
Cosa succede alla creazione di una variabile locale?
-
Dichiarazione
Viene dichiarata all’interno di un metodo o di un blocco. Viene allocata nello stack. -
Inizializzazione
Viene assegnato un valore esplicito alla variabile. La memoria nello stack contiene direttamente il valore (non un riferimento, se è un tipo primitivo).- Per i tipi primitivi, lo stack contiene direttamente il valore.
- Per i tipi riferimento, lo stack contiene l’indirizzo dell’oggetto nello heap (se è stato creato con
new).
Cosa succede alla creazione di un campo static?
- I campi
staticvengono allocati una sola volta per classe, indipendentemente dal numero di oggetti creati. - Vengono allocati in una sezione speciale della memoria chiamata Metaspace (nelle JVM recenti, a partire da Java 8).
- Vengono inizializzati all’avvio della classe (di solito al primo accesso a un membro statico o alla classe stessa), prima di qualsiasi istanza della classe.