Regioni dell'heap della JVM e ciclo di vita degli oggetti
Esplori Young Generation (Eden, Survivor), Old Generation e Metaspace e comprenda come gli oggetti si spostano tra queste aree.
Regioni dell'heap della JVM e ciclo di vita degli oggetti è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.
Il modello di memoria della JVM
La JVM divide la memoria in diverse aree. L'heap contiene tutte le istanze delle classi e gli array. Le aree off-heap includono Metaspace, che contiene i metadati delle classi, i frame dello stack e la memoria nativa.
Young Generation: spazio Eden
Gli oggetti appena allocati vengono collocati in Eden. Quando Eden si riempie, viene eseguito un Minor GC. Gli oggetti sopravvissuti vengono copiati in uno spazio Survivor.
// Object allocation starts in Eden:
String s = new String("hello"); // allocated in Eden
List<Integer> list = new ArrayList<>(); // also EdenSpazi Survivor: S0 e S1
I due spazi Survivor, S0 e S1, contengono gli oggetti sopravvissuti ad almeno un GC. A ogni Minor GC, gli oggetti si alternano tra S0 e S1. Il loro contatore dell'età aumenta.
Soglia di tenuring
Quando l'età di un oggetto supera la soglia di tenuring, il cui valore predefinito è 15, l'oggetto viene promosso alla Old Generation. Gli oggetti di grandi dimensioni possono saltare la Young Gen e passare direttamente alla Old Gen.
// JVM flags:
// -XX:MaxTenuringThreshold=15 (default)
// -XX:PretenureSizeThreshold=1m (objects > 1MB go directly to Old Gen)Old Generation (spazio tenured)
Gli oggetti di lunga durata risiedono nella Old Gen. I GC Major, o Full GC, raccolgono la Old Gen e hanno un costo maggiore. Ridurre il numero di oggetti di lunga durata diminuisce la frequenza dei Full GC.
Metaspace (Java 8+)
Metaspace ha sostituito PermGen in Java 8. Contiene i metadati delle classi, il bytecode dei metodi e le stringhe internate. Utilizza memoria nativa e cresce dinamicamente, con un limite imposto da -XX:MaxMetaspaceSize.
// Flag examples:
// -XX:MetaspaceSize=64m (initial Metaspace size)
// -XX:MaxMetaspaceSize=256m (cap to avoid native OOM)Fast path per l'allocazione degli oggetti
La JVM utilizza i Thread-Local Allocation Buffers (TLAB) per allocare memoria in Eden senza sincronizzazione. Ogni thread ha una propria piccola porzione di Eden.
Ciclo di vita degli oggetti: raggiungibilità
Un oggetto è vivo se è raggiungibile da una radice del GC, come una variabile dello stack, un campo statico o un riferimento JNI. Gli oggetti non raggiungibili possono essere raccolti.
Object a = new Object(); // reachable via local variable
a = null; // now unreachable — eligible for GCRiferimenti Soft, Weak e Phantom
SoftReference viene eliminato prima di un OOM ed è utilizzato per le cache. WeakReference viene eliminato al GC successivo. PhantomReference viene utilizzato per la pulizia post-mortem.
Cache<String, Image> cache = new LinkedHashMap<>();
// Use SoftReference to let GC reclaim cache under memory pressure:
SoftReference<Image> ref = new SoftReference<>(loadHeavyImage());
Image img = ref.get(); // null if GC collected itFinalizzazione degli oggetti (da evitare)
finalize() è deprecato e imprevedibile: il GC lo chiama prima della raccolta, ma il momento non è garantito. Utilizzi Cleaner (Java 9+) o try-with-resources.
Flag per dimensionare l'heap
Controlli l'heap con -Xms, che indica la dimensione iniziale, e -Xmx, che indica quella massima. In produzione, li imposti allo stesso valore per evitare pause dovute al ridimensionamento dell'heap.
// Recommended production flags:
// -Xms512m -Xmx512m (fix heap to 512 MB)
// -XX:NewRatio=2 (Old:Young = 2:1)Verifica rapida
Dove risiede inizialmente un oggetto appena allocato nell'heap della JVM?
Riepilogo
L'heap della JVM comprende la Young Gen, formata da Eden e dagli spazi Survivor, e la Old Gen. Gli oggetti invecchiano attraverso i Minor GC e vengono promossi. Metaspace contiene i metadati delle classi. È possibile controllare il comportamento con -Xms/-Xmx e i flag di configurazione.
Domande Frequenti
La lezione «Regioni dell'heap della JVM e ciclo di vita degli oggetti» è gratuita?
Sì — il testo completo di «Regioni dell'heap della JVM e ciclo di vita degli oggetti» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.
Cosa imparerò in «Regioni dell'heap della JVM e ciclo di vita degli oggetti»?
Esplori Young Generation (Eden, Survivor), Old Generation e Metaspace e comprenda come gli oggetti si spostano tra queste aree. Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Java Academy?
Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Regioni dell'heap della JVM e ciclo di vita degli oggetti»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Java Academy?
Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Regioni dell'heap della JVM e ciclo di vita degli oggetti
- Algoritmi GC: Serial, G1, ZGC, Shenandoah
- Rilevare e correggere i memory leak
- Flag per il tuning del GC e profiling con JVisualVM