Oliver B. Fischer arbeitet bei der E-Post Development GmbH und organisiert die JUG Berlin-Brandenburg.

„Ob eine Anwendung von diesen drei Techniken in der realen Welt profitiert, scheint vom Einzelfall abhängig zu sein und muss individuell bestimmt werden.“

Eine gute Frage in einem Einstellungsgespräch ist immer noch, warum denn Programme auf der JVM eine recht ordentliche Performance aufweisen, obwohl nur mit Bytecode und nicht mit Maschinencode gearbeitet wird. Wer diese Hürde mit Leichtigkeit genommen hat, dem werden in diesem Artikel weitere Möglichkeiten des JDK verraten, mit denen Oracle versucht, die Leistung der JVM zu verbessern.

Die Performance von Programmen auf der JVM, dabei geht es explizit nicht nur um Java-Programme, steht der von nativen Anwendungen in nichts mehr nach. Das ist seit Jahren bekannt. Der JIT-Compiler des JDK leistet
hervorragende Arbeit, wenn es um Codeoptimierung und Generierung von Maschinencode geht. Das ist einer der Gründe für die Stellung von Java bei der Entwicklung von Serveranwendungen. Jedoch konnte Java sich nie als Sprache für kleine Programme oder als Skriptingumgebung etablieren, besonders nicht in den Bereichen Administration oder heute DevOps. Dass dem so ist, liegt nicht an der Sprache an sich, sondern vielmehr an dem langsamen Start der JVM, der je nach Umgebung bis zu ein paar hundert Millisekunden brauchen kann.

Listing 1 zeigt das übliche Hello-World-Programm, Listing 2 dessen Ausführungsdauer und Listing 3 die eines äquivalenten C-Programms im Vergleich. Der Unterschied zwischen beiden liegt bei 119 ms, eine Spanne, die auch für uns Menschen wahrnehmbar ist, oder anders gesagt, dass C-Programm wird in einem Dreißigstel der Zeit des Java-Programms ausgeführt. Genau genommen lassen sich beide Programme nicht vergleichen, da bei ihrer Ausführung unterschiedliche Dinge passieren. Aus Anwendersicht ist es allerdings egal, warum Programm A schneller ist als Programm B. Bei solchen Programmen kann die JVM ihre Vorteile wie die Just-in-Time Compilation nicht ausspielen. Rufen wir uns grob vor Augen, was die JVM vor der Ausführung des eigentlichen Programms tut: Start der JVM selbst, Laden der für die JVM benötigten JARs bzw. Module, deren Initialisierung und Bytecodeverifizierung. Das alles kostet Zeit. Über die Jahre haben zuerst Sun und später Oracle viel für die die Verbesserung der Startzeit getan. Über verschiedene Java-Versionen hinweg wurden drei Techniken eingeführt, die wir als Java-Entwickler selbst direkt nutzen können.

CDS – Class Data Sharing

Class Data Sharing (CDS) hielt bereits mit Java 5 Einzug in die JVM und erlaubt einen Dump der internen Repräsentation der beim Start geladenen Klassen in eine Datei, die dann bei jedem Start der JVM, gesteuert über den JVMParameter -Xshare:[on|off|auto|dump], als Memory Mapped File geladen wird und das Laden der JARs überflüssig macht. Je nach Installationsart (Installer oder manuelle Installation) ist diese Datei bereits vorhanden oder nicht. Falls nicht, kann sie manuell mittels java -Xshare:dump erzeugt werden.

Den vollständigen Artikel lesen Sie in der Ausgabe:

Java Magazin 8.18 - "Privacy by Design: Mit Netz und doppeltem Boden"

Alle Infos zum Heft
579847848JVM-Performance: CDS, AppCDS und AOT im Überblick
X
- Gib Deinen Standort ein -
- or -