Middle
Come è strutturata la memoria in Java?
sobes.tech AI
Risposta dell'AI
In Java, la memoria viene gestita automaticamente dal garbage collector e viene suddivisa in diverse aree:
-
Heap (Heap):
- Memorizza oggetti di classi e array.
- Una sola per tutti i thread dell'applicazione.
- Il garbage collector lavora con questa area.
- È divisa in generazioni (Giovane, Vecchio, Permanente).
-
Stack (Pila):
- Ogni thread ha la sua pila.
- Memorizza variabili locali di tipi primitivi e riferimenti a oggetti nell'heap.
- I dati vengono aggiunti e rimossi secondo il principio LIFO (Last-In, First-Out).
- Viene liberata automaticamente al termine del metodo.
-
Method Area (Area dei metodi) / PermGen (fino a Java 8) / Metaspace (a partire da Java 8):
- Memorizza informazioni sulle classi caricate:
- Metadati delle classi.
- Bytecode dei metodi.
- Variabili statiche.
- Costanti del pool.
- La dimensione di PermGen era fissa, Metaspace utilizza memoria nativa e può espandersi dinamicamente.
- Memorizza informazioni sulle classi caricate:
-
Native Method Stacks (Pile dei metodi nativi):
- Usato per chiamate a metodi nativi (ad esempio, C/C++).
- Viene liberata al termine del metodo nativo.
// Esempio di utilizzo della memoria
public class MemoryExample {
private String instanceVariable; // Memorizzata nell'Heap
public void myMethod(int parameter) { // parameter memorizzato nello Stack
int localVar = 10; // localVar nello Stack
String localString = "hello"; // "hello" nel String Pool (parte dell'Heap/Method Area), il riferimento localString nello Stack
Object obj = new Object(); // Object nell'Heap, il riferimento obj nello Stack
Integer wrapper = new Integer(5); // Integer nell'Heap, il riferimento wrapper nello Stack
}
public static void main(String[] args) {
MemoryExample example = new MemoryExample();
example.myMethod(20);
}
}
Aree di memoria e loro contenuto:
| Area | Dove si trova? | Cosa memorizza? | Gestione |
|---|---|---|---|
| Heap | Condivisa per la JVM | Oggetti, array | Garbage Collector |
| Stack | Propria per ogni thread | Variabili locali primitive, riferimenti ad oggetti | Automatico (al termine del metodo) |
| Method Area | Condivisa per la JVM | Metadati delle classi, variabili statiche, bytecode, costanti | Garbage Collector (per classi e statici) |
| Native Stacks | Propria per ogni thread (al chiamare) | Variabili e dati dei metodi nativi | Automatico (al termine del metodo nativo) |