JVM-Heap-Bereiche und Objektlebenszyklus
Untersuchen Sie die Young Generation (Eden, Survivor), die Old Generation und den Metaspace sowie die Bewegung von Objekten zwischen diesen Bereichen.
JVM-Heap-Bereiche und Objektlebenszyklus ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Das JVM-Speichermodell
Die JVM teilt den Speicher in mehrere Bereiche auf. Der Heap enthält alle Klasseninstanzen und Arrays. Zu den Off-Heap-Bereichen gehören Metaspace für Klassenmetadaten, Stack-Frames und nativer Speicher.
Young Generation: Eden-Bereich
Neu zugewiesene Objekte gelangen in den Eden-Bereich. Wenn Eden voll ist, wird eine Minor GC ausgeführt. Überlebende Objekte werden in einen Survivor-Bereich kopiert.
// Object allocation starts in Eden:
String s = new String("hello"); // allocated in Eden
List<Integer> list = new ArrayList<>(); // also EdenSurvivor-Bereiche: S0 und S1
In den beiden Survivor-Bereichen S0 und S1 werden Objekte gespeichert, die mindestens eine GC überlebt haben. Bei jeder Minor GC wechseln die Objekte zwischen S0 und S1. Ihr Alterszähler wird erhöht.
Tenuring-Schwellenwert
Wenn das Alter eines Objekts den Tenuring-Schwellenwert überschreitet, standardmäßig 15, wird es in die Old Generation befördert. Große Objekte können die Young Generation überspringen und direkt in die Old Generation gelangen.
// JVM flags:
// -XX:MaxTenuringThreshold=15 (default)
// -XX:PretenureSizeThreshold=1m (objects > 1MB go directly to Old Gen)Old Generation (Tenured-Bereich)
Langlebige Objekte befinden sich in der Old Generation. Major GCs beziehungsweise Full GCs sammeln die Old Generation ein und sind aufwendiger. Wenn Sie die Anzahl langlebiger Objekte reduzieren, verringert sich die Häufigkeit von Full GCs.
Metaspace (Java 8+)
Metaspace ersetzte PermGen in Java 8. Er enthält Klassenmetadaten, Methoden-Bytecode und internierte Strings. Er verwendet nativen Speicher und wächst dynamisch, begrenzt durch -XX:MaxMetaspaceSize.
// Flag examples:
// -XX:MetaspaceSize=64m (initial Metaspace size)
// -XX:MaxMetaspaceSize=256m (cap to avoid native OOM)Schneller Pfad für die Objektzuweisung
Die JVM verwendet Thread-Local Allocation Buffers (TLABs), um ohne Synchronisierung Speicher in Eden zuzuweisen. Jeder Thread verfügt über einen eigenen kleinen Eden-Bereich.
Objektlebenszyklus: Erreichbarkeit
Ein Objekt ist aktiv, wenn es von einer GC-Root aus erreichbar ist, etwa von einer Stack-Variablen, einem statischen Feld oder einer JNI-Referenz. Nicht erreichbare Objekte können von der GC eingesammelt werden.
Object a = new Object(); // reachable via local variable
a = null; // now unreachable — eligible for GCSoft-, Weak- und Phantom-Referenzen
SoftReference wird vor einem OOM gelöscht und wird für Caches verwendet. WeakReference wird bei der nächsten GC gelöscht. PhantomReference wird zur Bereinigung nach dem Ende der Objektlebensdauer verwendet.
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 itObjekt-Finalisierung (vermeiden)
finalize() ist veraltet und unvorhersehbar – die GC ruft die Methode vor dem Einsammeln auf, aber der Zeitpunkt ist nicht garantiert. Verwenden Sie stattdessen Cleaner ab Java 9 oder try-with-resources.
Flags zur Heap-Größe
Steuern Sie die Heap-Größe mit -Xms für die Anfangsgröße und -Xmx für die maximale Größe. Setzen Sie beide Werte in der Produktion gleich, um Pausen durch eine Größenanpassung des Heaps zu vermeiden.
// Recommended production flags:
// -Xms512m -Xmx512m (fix heap to 512 MB)
// -XX:NewRatio=2 (Old:Young = 2:1)Kurzer Test
Wo befindet sich ein neu zugewiesenes Objekt zunächst im JVM-Heap?
Zusammenfassung
Der JVM-Heap besteht aus der Young Generation mit Eden und den Survivor-Bereichen sowie der Old Generation. Objekte altern durch Minor GCs und werden anschließend befördert. Metaspace enthält Klassenmetadaten. Die Speicherverwaltung lässt sich mit -Xms/-Xmx und Tuning-Flags steuern.
Häufig gestellte Fragen
Ist die Lektion „JVM-Heap-Bereiche und Objektlebenszyklus“ kostenlos?
Ja — der vollständige Text von „JVM-Heap-Bereiche und Objektlebenszyklus“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „JVM-Heap-Bereiche und Objektlebenszyklus“?
Untersuchen Sie die Young Generation (Eden, Survivor), die Old Generation und den Metaspace sowie die Bewegung von Objekten zwischen diesen Bereichen. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „JVM-Heap-Bereiche und Objektlebenszyklus“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- JVM-Heap-Bereiche und Objektlebenszyklus
- GC-Algorithmen: Serial, G1, ZGC, Shenandoah
- Speicherlecks erkennen und beheben
- GC-Tuning-Flags und JVisualVM-Profiling