Java  Implementierungsstrategien für die JVM  

... [ Seminar "Java und Werkzeuge für das Web" ]  ... [ Inhaltsverzeichnis ]  ... [ zurück ]  ... [ weiter ] ...
     

Kompilation, Just-in-time-Kompilation


Ein Java Interpreter ruft während des Abarbeitens von Bytecode Unterprogramme auf, die den jeweiligen Bytecode als Sequenz von Maschinenbefehlen des zugrundeliegenden Computersystems repräsentieren. Da diese Unterprogramme selber schon Maschinencode sind, der direkt auf der zugrundeliegenden CPU ausgeführt werden kann, liegt nichts näher, als während der Abarbeitung des Bytecodes diesen Maschinencode zu sammeln, und die Bytecode-Sequenzen nach und nach durch den fertigen Maschinencode zu ersetzen. Somit wird der Bytecode während des Interpretierens compiliert.

    

JIT

1.Methode

  • Stack wird auf Stack der Registermaschine abgebildet 

  • Oberstes Stackelement kommt in den Akku

  • Einfach zu Implementieren

  • Schnelle Compilierungszeit 

  • Unnötige Speicherzugriffe 

   

2.Methode

  • Übersetzung in Zwischencode mit unendlich vielen Pseudoregistern

  • Abbildung der Pseudoregister auf Maschinenregister 

  • schnelle Ausführungszeit

  • Längere Kompilierung

  

Beispiel: b = a + c * d

iload a iload c iload d
iload a iload c iload d
        
imul iadd istore b
imul iadd istore b

        

Übersetzung von Stackcode zum Registercode: 

JVM i386       i386

iload a       PUSH EAX
MOV EAX,a
MOV EAX,a
iload c PUSH EAX
MOV EAX,c
MOV EBX,c
iload d PUSH EAX
MOV EAX,d
MOV ECX,d
imul POP EBX
IMUL EBX
IMUL EBX,ECX
iadd POP EBX
ADD EAX,EBX
ADD EAX,EBX
istore b MOVE b,EAX
POP EAX
MOVE b,EAX

  


Kompilierung mit einem C-Compiler

MOV EAX,c

IMUL EAX,d

ADD EAX,a

MOV b,EAX

   


Vorteile der JIT Kompilierung

  • Da dieser Vorgang während der Laufzeit geschieht, bleibt das Java-Programm plattformunabhängig

  • Die Abarbeitungsgeschwindigkeit kann drastisch gesteigert werden

   


Nacheile der JIT Kompilierung

  • Da der JIT-Kompiler zur Laufzeit kompiliert, ist er mehr damit beschäftigt, den Code schnell zu kompilieren, als ihn effizient zu kompilieren, da durch den Kompilevorgang soll die Ausführung des Bytecodes auf keinen Fall verlangsamt werden.

  • Bei jedem neuen Start des Java-Programms wird der Bytecode wieder aufs neue kompiliert. Beim beenden eines Java-Programms wird der kompilierte Code komplett verworfen.

  • Methoden werden kompiliert, auch wenn sie eventuell nur einmal aufgerufen werden. Somit kann das Kompilieren und anschließende Ausführen des nativen Codes mehr Rechenzeit in Anspruch nehmen als einmalige Interpretieren des Bytecodes.


Implementierungen von JIT Compiler

Cacao

CACAO

Das Interessante an Cacao ist die Implementation der Übersetzung durch das obenerwähnte Registermodell  der von Cacao erzeugte Code ist daher sehr schnell. Cacao war anfangs eine Diplomarbeit - wird jedoch momentan noch an der Technischen Universität Wien weiterentwickelt. Ein Problem ist die nur teilweise Implementation der Java 1.1 API.

TYA

  • TYA linkt sich in den Methodenaufruf eines bestehenden Java Interpreters.

  • Wird eine Methode aufgerufen, tritt stattdessen TYA in Kraft.

  • Wurde die Methode schon compiliert, wird Sie über das Java Native Interface (JNI) aufgerufen, ansonsten wird sie erst kompiliert. 

  • Ein Vorteil von TYA ist,  dass er einfach anwendbar, klein und jederzeit ein- und ausschaltbar ist.

Kaffe

KAFFE

Die Kaffe OpenVM ist eine unabhängige Implementierung einer virtuellen Java-Maschine mit eigenen JIT Compiler und geht bezüglich minimalem Speicherverbrauch neue Wege.Der JIT-Compiler Kaffe liegt nun mittlerweile in der Version 1.0 vor. Das besondere an ihm ist, neben der Verfügbarkeit unter der GNU Public License (GPL), daß er als Personal Java 1.1 compliant gilt. Dies bedeutet, daß eine Untermenge der kompletten Java 1.1 API unterstützt wird und damit eine große Anzahl an Java-Programmen unter Kaffe lauffähig ist. Kaffe implementiert weiterhin ein kompletes Laufzeitsystem inklusive Unterstützung für das Java Native Interface.

 

     


index