next up previous contents
Next: Optimierung von Java-Programmen Up: Programmausführung Previous: Programmausführung   Inhalt


Das Maschinenmodell der JVM

Abbildung: Ausführungsmodell von Java
\scalebox{0.6}{\includegraphics{execution/util/bytecodes}}

Die für Java spezifizierte virtuelle Maschine ist im Groben in Abbildung 2.2 dargestellt und mit den relevanten Instruktionsnamen versehen. Auf einem gemeinsamen Objektspeicher operieren mehrere Threads; jeder dieser Threads besitzt einen eigenen Aufruf-Stack. Jede Aktivierung innerhalb eines Stacks beinhaltet zwei Speicherbereiche: lokale Variablen und einen Stack für Berechnungen. Dieser Stack ist von zentraler Bedeutung: er ist Operanden- und Ergebnisspeicher für arithmetische Operationen, wird gleichermaßen zur Parameter- und Ergebnisübergabe verwendet und ist Zwischenstation beim Transfer zwischen lokalen Variablen und Heap. In dieser Hinsicht ist das Java-Modell mit dem von Smalltalk identisch und wird als Stack-Maschine bezeichnet.

Mit einer Zahl von Bytecode-Instruktionen kann der Kontrollfluß innerhalb einer Methode gesteuert werden: bedingte und unbedingte Sprünge, sowie Ausnahmebehandlung und sogar Subroutinen. Weiterhin existieren zwei Instruktionen zur Synchronisierung von Threads.

Die virtuelle Maschine von Java ist getypt. Sie unterscheidet mehrere Basisdatentypen sowie Objekt- und Array-Referenzen. Der Instruktionssatz enthält für jeden Typ Varianten der Instruktionen, beispielsweise existieren fünf Varianten, um eine lokale Variable auf den Stack zu laden. Auf diese Weise erklärt sich die Zahl von rund 200 Instruktionen.

Um die Integrität der virtuellen Maschine zu gewährleisten, beispielsweise, um zu verhindern, daß eine Ganzzahl fälschlicherweise als Objektreferenz interpretiert wird, muß die VM unter anderem eine Typprüfung des Bytecodes vornehmen. Nur Code, der eine solche Prüfung zulässt und dabei den Typregeln entspricht, wird ausgeführt. Bei näherer Betrachtung wird deutlich, daß die Typisierung des Bytecode daher keinerlei Vorteil darstellt: zu Verifikationszwecken wird der Typ jeder Variablen ohnehin rekonstruiert und bräuchte daher nicht in jeder Instruktion mit angegeben werden -- eine Typisierung der Objektfelder und Methodensignaturen würde hier ausreichend Informationen liefern und den Bytecode schlanker gestalten. Die Typisierung der Variablen ist auch für die Speicherverwaltung von Interesse, näheres hierzu findet sich in Abschnitt 2.2.2.

Die Spezifikation sieht das inkrementelle Laden und Binden von Klassen vor. Hierbei muß die Kompatibilität der Klassen untereinander geprüft werden.


next up previous contents
Next: Optimierung von Java-Programmen Up: Programmausführung Previous: Programmausführung   Inhalt

2001-02-28