Heim

Java Virtual Machine

Die Java Virtual Machine (abgekürzt Java VM oder JVM) ist der Teil der Java-Laufzeitumgebung (JRE) für Java-Programme, der für die Ausführung des Java-Bytecodes verantwortlich ist. Hierbei wird im Normalfall jedes gestartete Java-Programm in seiner eigenen virtuellen Maschine ausgeführt. Der andere Teil der Java-Laufzeitumgebung sind die Java-Klassenbibliotheken.

Die JVM dient dabei als Schnittstelle zur Maschine und zum Betriebssystem und ist für die meisten Plattformen verfügbar. (z. B. Linux, Mac, Palm OS, Solaris, Windows, usw.).


Die Bestandteile der JVM sind

Die Java Virtual Machine lässt sich durch Erweiterungen wie OSGi zu einem dynamischen Framework erweitern, das flexibel Java-Klassen nachladen sowie unterschiedliche Versionen und Abhängigkeiten verwalten kann.

Inhaltsverzeichnis

Sicherheitsvorteile

Die Java Virtual Machine bietet neben der Plattformunabhängigkeit auch einen Gewinn an Sicherheit. Suns JVM überwacht zur Laufzeit die Ausführung des Programms, verhindert also z. B., dass ein Programm über Arraygrenzen hinweg liest oder schreibt. Im speziellen Fall von Java fällt diese Überwachung sehr einfach aus, da Java keine Zeiger unterstützt. Somit werden die gefürchteten Pufferüberläufe verhindert, die vor allem bei den in C oder C++ geschriebenen Programmen vorkommen und von Angreifern dazu benutzt werden können, fremden Code auf einem System auszuführen, es somit anzugreifen und unter Kontrolle zu bringen.

Optimierungsverfahren

Aus Gründen der Ausführungs-Geschwindigkeit ("performance") setzen die meisten Java-VMs sogenannte JIT-Compiler (JITC) ein, die unmittelbar beim Laufen des Programms den Bytecode „Just In Time“ („Genau rechtzeitig“, oder „Gerade zur rechten Zeit") in Maschinencode übersetzen. Eine Weiterentwicklung dieses Ansatzes ist der von Sun entwickelte Hotspot-Optimizer. Diese Entwicklung behebt weitgehend den Geschwindigkeitsnachteil der JVM, der hohe Speicherverbrauch bleibt jedoch bestehen. Außerdem gibt es designbedingt einige Einbußen, vor allen Dingen durch die automatische Speicherbereinigung (garbage collection). Jedoch gibt es von anderen Herstellern JVMs, die diese Nachteile ebenfalls weitestgehend kompensieren, durch den Einsatz sehr ausgefeilter Techniken (IBM J9 oder Insignia Jeode).

Dynamische Optimierung

Das Konzept der Java Virtual Machine hat – zumindest vom theoretischen Standpunkt aus – auch Vorteile. Beispielsweise ist es so, dass zum Zeitpunkt des Compilierens üblicher Software für eine System-Architektur nicht bekannt ist, welche konkrete Eingabe die Software haben wird. Demzufolge muss die Software mit allen Arten von Eingaben zurecht kommen. Die Eingabe wird demnach in Variablen gespeichert. Nach dem Start des Programms werden jedoch viele Variablen nicht mehr geändert. Folglich sind diese – von einem Zeitpunkt kurz nach dem Start an – Konstanten. Wird nun erst nach diesem Zeitpunkt die Software für die System-Architektur compiliert (dies ist bei Java Hotspot der Fall), so können diese Konstanten berücksichtigt werden. Bestimmte Verzweigungen im Programmcode, die nur von solchen „Halbkonstanten“ abhängig sind, sind dann für immer eindeutig und stellen somit kein Risiko für eine falsche Branch Prediction dar. Ein solcher Programmcode kann also theoretisch schneller ablaufen als zu früh compilierter Code.

Implementierungen in Hardware

Ausführungen in Hardware sind Java-Prozessoren, Mikroprozessoren, die Java-Bytecode als Maschinensprache verwenden. Sie konnten sich gegen die schnelle Steigerung der Leistungsfähigkeit von Standard-PC und JVM nicht durchsetzen.

Abschottung der Threads

Die Java VM schottet die in ihr laufenden Prozesse (Threads) vom Betriebssystem ab (Green Threads). Dies hat zur Folge, dass es nicht mehr möglich ist, mit systemeigenen Mitteln Prozesse zu kontrollieren. Sie stellt aber auch keine eigenen Funktionen zur Prozesskontrolle und -steuerung bereit. Somit können diese auch nicht von außen beendet werden, wenn sie aufgrund eines Fehlers das Gesamtsystem stören. Dazu muss dann die gesamte VM beendet werden. Manche Java Virtual Machines erlauben allerdings das direkte Mappen von dedizierten Java-Threads auf Betriebssystem-Prozesse (native Threads).

Mittlerweile ist das Mappen von Java-Threads die Default-Einstellung, d. h. nur in Ausnahmefällen wie dem Verwenden einer älteren VM erfolgt das Thread-Management nur durch die VM und nicht durch das Mapping auf Threads des Betriebssystems.

Siehe auch