Das Wissensportal für IT-Professionals. Entdecke die Tiefe und Breite unseres IT-Contents in exklusiven Themenchannels und Magazinmarken.

SIGS DATACOM GmbH

Lindlaustraße 2c, 53842 Troisdorf

Tel: +49 (0)2241/2341-100

kundenservice@sigs-datacom.de

Editorial JavaSPEKTRUM 3/2024: Der heilige Graal

Ein wichtiges Ziel von Java-Entwicklern ist die effiziente Ausführung ihrer Anwendungen. Zu diesem Zweck können sie entsprechende Designtaktiken und Entwurfsmuster für Performanz sowie geeignete Java-Idiome nutzen. Bei der Integration von 3rd-Party-Komponenten lassen sich Erfahrungswerte und die zugehörigen Best Practices einsetzen, um die Komponenten entsprechend effizient zu integrieren und zu verwenden.

Author Image
Michael Stal

Chefredakteur von JavaSPEKTRUM


  • 24.05.2024
  • Lesezeit: 4 Minuten
  • 94 Views

Was sich jedoch dem Einfluss entzieht, ist die zugrunde liegende Java- beziehungsweise JDK-Plattform mit der dort verfügbaren JVM. Achtet diese nicht auf Ausführungseffizienz, so begrenzt sie die Möglichkeiten signifikant, was sich auch in Bezug auf „fremde“ Komponenten auswirkt. Die liegen oft nicht im Quellcode vor. Selbst wenn sie als Open-Source-Software (OSS) zur Verfügung stehen, weisen sie eine nicht zu unterschätzende Komplexität auf, was Änderungen zur Optimierung betrifft. Und selbst wenn Änderungen sich als nicht komplex erweisen, müssten Entwickler diese Änderungen in die OSS-Komponenten einbringen, um nicht den Versionierungstod durch ständiges Nachziehen des Codes zu sterben.

Ausführbarer nativer Code ist oft effizienter als die Ausführung in der JVM

Bekanntermaßen ist ausführbarer nativer Code oft effizienter als die Ausführung in der JVM. Daher liegt der Wunsch nahe, Java-Anwendungen in nativen Code zu übersetzen. Genau das bietet die GraalVM von Oracle. Die GraalVM ist im Grunde genommen eine komplette Plattform mit Werkzeugen und Bibliotheken. Sie besitzt unter anderem eine reine JVM-Implementierung und ein JDK-Framework.

Sie bietet zusätzlich den Native Image Builder beziehungsweise native-image, ein Werkzeug, das die Metainformation aus bestehendem Java-Code dafür nutzt, um daraus nativen, optimierten Code für die vorliegende Hardwareplattform zu erzeugen. Dieses Vorgehen firmiert unter dem Namen AOT-Compiling (AOT = Ahead of Time). Vor dem Aufruf von native-image ist die Übersetzung mit dem Java-Compiler javac erforderlich, weil das Werkzeug auf Java-Bytecode aufsetzt.

Dies setzt natürlich voraus, dass die Ausführung der Java-Anwendung tatsächlich alle Ablaufpfade durchläuft, weil native-image nur statische Metainformation erfassen kann, die es vom initialen Startpunkt der Anwendung erreicht. Kommen nicht alle Codepfade im dynamischen Ablauf vor, können Programmierer die benötigte Information auch manuell in einer Konfigurationsdatei spezifizieren. Als Eingabe für native-image funktionieren neben Java-Class-Dateien auch JAR-Dateien oder Java-Module.

Das funktioniert bei der GraalVM selbst für das Nutzen von Java Reflection, besitzt aber dort auch Grenzen. Beispielsweise existieren in Log4j im Gegensatz zu Logback einige Funktionalitäten, die wegen des Gebrauchs von Reflection die Anwendung von native-image verhindern. Als Faustregel lässt sich grob sagen, dass alle Log4j-Funktionalität, die sich auch in Logback findet, für native-image geeignet ist.

In diesem Zusammenhang bietet sich der Einsatz von SLF4J (Simple Logging Facade for Java) an, das erlaubt, das Logging-Framework über eine Wrapper-Schicht zu verbergen. Dadurch ist es sogar möglich, in Projekten das Logging-Framework gegen ein anderes auszutauschen. Viele Frameworks sind kompatibel mit native-image, so zum Beispiel Spring Boot. Selbstverständlich stellt GraalVM diverse GC-Implementierungen bereit, von denen der Entwickler die jeweils geeignetste herauspickt.

Doch was bringt das Ganze? In einem meiner letzten Projekte ergaben sich durch GraalVM-erzeugten nativen Code erhebliche Vorteile gegenüber einer JVM, sowohl in Bezug Initialisierungszeit als auch Laufzeit, obwohl auch die JVM-Implementierung effizient ist.

GraalVM bietet den Native Image Builder

Das in der GraalVM-Plattform integrierte Truffle Language Implementation Framework hilft bei der Implementierung eigener Werkzeuge oder Programmiersprachen. Es erzeugt Interpreter für sich selbst modifizierende abstrakte Syntaxbäume. Wer sich an die Vorgaben des Polyglot TCK (Polyglot API-based Test Compatibility Kit) hält, stellt sicher, dass die eigene Truffle-Sprachimplementierung auch mit anderen kompatiblen Truffle-Implementierungen zusammenarbeiten kann. Die Dokumentation stellt mit simpletool ein einfaches Beispiel zur Verfügung, das Entwickler auch als Basis für eigene Truffle-Implementierungen verwenden können.

Einige Teile von GraalVM wie native-image existieren nicht in der Community-Edition. Dafür ist die frühere Enterprise-Version jetzt drei Jahre lang ohne Lizenzkosten nutzbar.

Sie finden in dieser Ausgabe Schwerpunktartikel zum obigen Thema. In diesem Sinne wünsche ich Ihnen viel Vergnügen beim Lesen und dem Gewinnen neuer Erkenntnisse.

Ihr Prof. Dr. Michael Stal

. . .

Author Image

Michael Stal

Chefredakteur von JavaSPEKTRUM
Zu Inhalten

Prof. Dr. Michael Stal beschäftigt sich bei der Corporate Technology der Siemens AG mit Software- und Systemarchitekturen, Digitalisierung und KI. An der University of Groningen hält er Vorlesungen und betreut Doktoranden. Außerdem ist er Chefredakteur von JavaSPEKTRUM.


Artikel teilen