← SEARCHABLE ARCHIVE
Java · 2026-08-10

Java von den Grundlagen bis zum Profi — Folge 9

Verstehen der Rollen von JVM-Speicher, GC und JIT

INTERACTIVE READING MODE →

Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.

Java-Code läuft auf der JVM und übernimmt mithilfe der Laufzeit das Laden von Klassen, die Speicherverwaltung und die Ausführungsoptimierung. Anstatt sich die interne Terminologie zu merken, ist es wichtig zu verstehen, wie sich dieser Prozess auf Leistung und Fehler auswirkt.

Klassenladen und Bytecode

Source.java
   ↓ compiler
Source.class
   ↓ class loader
JVM execution

Der Klassenlader findet die erforderliche Klasse und überprüft, ob sie in einer Form vorliegt, die von der JVM verwendet werden kann. Wenn der Klassenpfad oder die Abhängigkeiten nicht übereinstimmen, wird die Klasse möglicherweise während der Ausführung nicht gefunden, selbst wenn die Kompilierung erfolgreich ist.

Stapel und Haufen

Methodenaufrufinformationen und lokale Variablen werden im Aufrufrahmen jedes Threads verwaltet. Im verwalteten Heap-Bereich werden Objekte erstellt, auf die von mehreren Stellen aus verwiesen werden kann.

void update() {
    int damage = 10;
    Monster monster = new Monster();
    monster.takeDamage(damage);
}

Damage ist ein primitiver Wert und die Monstervariable ist eine Objektreferenz. Die tatsächliche Platzierung und Optimierung werden durch die JVM-Implementierung bestimmt, daher sollten nicht alle Objektpositionen anhand einfacher Formeln beurteilt werden.

Garbage Collector

Objekte, die nicht mehr erreichbar sind, unterliegen der GC-Sammlung. GC zu haben bedeutet nicht, dass es nie zu Speicherverlusten kommen wird.

Wenn eine statische Sammlung oder ein Ereignis-Listener weiterhin auf ein nicht verwendetes Objekt verweist, bleibt es erreichbar. Externe Ressourcen wie Dateien und Sockets sollten direkt geschlossen werden, ohne auf GC zu warten.

JIT-Optimierung

Die JVM kann Code optimieren, indem sie häufig verwendeten Code während der Ausführung beobachtet und ihn in Maschinensprache kompiliert. Die Beurteilung der Gesamtleistung anhand nur einer kurzen Ausführungszeit kann Vorbereitung und Optimierung verwirren.

Bei Leistungsproblemen sollten Kontingent, CPU-Auslastung und Sperrwartezeiten mithilfe eines Profilers gemessen werden, bevor die Heap-Größe oder die GC-Optionen geändert werden. JVM-Wissen ist die Grundlage für die Interpretation der Ursachen von Messergebnissen, nicht für spekulative Mikrooptimierung.