Sobes.tech
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:

  1. 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).
  2. 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.
  3. 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.
  4. 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)