EMZETT.
Login

JVM (Java Virtual Machine)

Kurz: Die JVM ist die „virtuelle Maschine”, die Java-Bytecode ausführt. Sie macht Java plattformunabhängig: Derselbe Bytecode läuft auf Windows, Linux und macOS, weil es für jedes System eine passende JVM gibt.

Genauer: Die JVM verhält sich wie ein kleiner, abstrakter Computer mit eigenem Befehlssatz (Bytecode), eigenem Speichermodell und eigener Speicherverwaltung. Sie sitzt als Schicht zwischen Programm und Betriebssystem.

Im Detail

Bestandteile der JVM:

  • Klassenlader: Lädt .class-Dateien bei Bedarf, prüft sie (Verifier) und verknüpft sie.
  • Speicherbereiche: Heap (Objekte), Stacks (je Thread: Aufrufe und lokale Variablen), Metaspace (Klasseninformationen).
  • Ausführungsmaschine: Ein Interpreter führt Bytecode aus, der JIT-Compiler (bei HotSpot: C1 und C2) übersetzt häufig genutzte Methoden in schnellen Maschinencode.
  • Garbage Collector: Gibt Speicher von Objekten frei, auf die niemand mehr zeigt (G1, ZGC, Shenandoah …).
  • Sicherheit: Der Bytecode-Verifier verhindert ungültigen Code. (Der frühere Security Manager ist veraltet.)

Wichtige Startoptionen:

java -Xms256m -Xmx2g -jar app.jar     # Start- und Höchstgröße des Heaps
java -XX:+UseZGC -jar app.jar          # Garbage Collector wählen
  • Andere Sprachen: Kotlin, Scala, Groovy und Clojure erzeugen ebenfalls Bytecode und laufen auf der JVM.
  • Mehrere JVMs: HotSpot (Standard in OpenJDK), GraalVM, OpenJ9. Die Sprache ist standardisiert, die Umsetzung nicht.
  • Kosten: Start dauert etwas und Speicher wird für die JVM selbst gebraucht. Dafür sind spitzenlastige Programme nach dem Warmlaufen sehr schnell.
  • Fehlersuche: OutOfMemoryError (Heap zu klein oder Leck), StackOverflowError (zu tiefe Rekursion).

Siehe auch: Laufzeitumgebungen: JVM, CLR, BEAM und Co., Bytecode, Garbage Collector