SlideShare a Scribd company logo
1 of 96
Download to read offline
Compilers Everywhere
Compilers Everywhere
Bernd M¨uller
Ostfalia
Bernd M¨uller 5.7.2018 1/48
Compilers Everywhere
Vortragstypus ???
Nice to Know
Bernd M¨uller 5.7.2018 2/48
Compilers Everywhere
Vortragstypus ???
Bernd M¨uller 5.7.2018 2/48
Compilers Everywhere
Agenda
Was ist Just-in-Time-Compilation ?
Was der JIT-Compiler so alles macht
VM-Schalter zum Selbstausprobieren . . .
Ahead of Time Compilation
Graal
GraalVM
(Demo)
Bernd M¨uller 5.7.2018 3/48
Compilers Everywhere
Referent
Vorstellung Referent
Prof. Informatik (Ostfalia, HS Braunschweig/Wolfenb¨uttel)
Buchautor (JSF, Seam, JPA, ...)
Mitglied EGs JSR 344 (JSF 2.2) und JSR 338 (JPA 2.1)
Gesch¨aftsf¨uhrer PMST GmbH
JUG Ostfalen (Mitorganisator)
. . .
bernd.mueller@ostfalia.de
@berndmuller
Bernd M¨uller 5.7.2018 4/48
Compilers Everywhere
(Java) Compiler Basics
(Java) Compiler Basics
Bernd M¨uller 5.7.2018 5/48
Compilers Everywhere
(Java) Compiler Basics
Compilers
A compiler is a program that reads a
program written in one programming
language – the source language – and
translates it into an equvalent program in
another language – the target language.
Bernd M¨uller 5.7.2018 6/48
Compilers Everywhere
(Java) Compiler Basics
Compiler (from Wikipedia)
. . .
The translation process influences the design of computer languages which leads to a
preference of compilation or interpretation.
. . .
In practice, an interpreter can be implemented for compiled languages and compilers
can be implemented for interpreted languages.
. . .
https://en.wikipedia.org/wiki/Compiler
Bernd M¨uller 5.7.2018 7/48
Compilers Everywhere
(Java) Compiler Basics
Compiler (from Wikipedia)
. . .
The translation process influences the design of computer languages which leads to a
preference of compilation or interpretation.
. . .
In practice, an interpreter can be implemented for compiled languages and compilers
can be implemented for interpreted languages.
. . .
https://en.wikipedia.org/wiki/Compiler
Bernd M¨uller 5.7.2018 7/48
Compilers Everywhere
(Java) Compiler Basics
The Java Language: A White Paper / An Overview, 1995
Section Interpreted
The Java interpreter can execute Java bytecodes directly on any machine to which the
interpreter has been ported. And since linking is a more incremental and lightweight
process, the development process can be much more rapid and exploratory.
Bernd M¨uller 5.7.2018 8/48
Compilers Everywhere
(Java) Compiler Basics
The Java Language: A White Paper / An Overview, 1995
Section High Performance
While the performance of interpreted bytecodes is usually more than adequate, there
are situations where higher performance is required. The bytecodes can be translated
on the fly (at runtime) into machine code for the particular CPU the application is
running on. For those accustomed to the normal design of a compiler and dynamic
loader, this is somewhat like putting the final machine code generator in the dynamic
loader. The bytecode format was designed with generating machine codes in mind, so
the actual process of generating machine code is generally simple.
In interpreted code we’re getting about 300,000 method calls per second on an Sun
Microsystems SPARCStation 10. The performance of bytecodes converted to machine
code is almost indistinguishable from native C or C++.
Bernd M¨uller 5.7.2018 9/48
Compilers Everywhere
(Java) Compiler Basics
The Java Language: A White Paper / An Overview, 1995
Section High Performance
While the performance of interpreted bytecodes is usually more than adequate, there
are situations where higher performance is required. The bytecodes can be translated
on the fly (at runtime) into machine code for the particular CPU the application is
running on. For those accustomed to the normal design of a compiler and dynamic
loader, this is somewhat like putting the final machine code generator in the dynamic
loader. The bytecode format was designed with generating machine codes in mind, so
the actual process of generating machine code is generally simple.
In interpreted code we’re getting about 300,000 method calls per second on an Sun
Microsystems SPARCStation 10. The performance of bytecodes converted to machine
code is almost indistinguishable from native C or C++.
Bernd M¨uller 5.7.2018 9/48
HotSpot-Ank¨undigung 1999
PARIS–(BUSINESS WIRE)–April 27, 1999
Sun Microsystems, Inc. today announced the release of the Java HotSpot(TM)
Performance Engine, the fastest software to date for Java(TM) technology
performance. The Java HotSpot performance engine breaks new ground in software
design and raises the bar by providing 100% higher performance than the previous Java
platform. The Java HotSpot Performance Engine will be available free of charge for
download at http://java.sun.com/products/hotspot/index.html.
”Java HotSpot Performance Engine turbocharges the Java 2 platform – performance is
no longer an issue,” said Jon Kannegaard, Vice President and General Manager, Java
Platform at Sun Microsystems, Inc.’s Java Software. This release maintains
uncompromising compatibility while dramatically boosting speed. It’s now the obvious
choice for deploying full-scale Java applications in the enterprise.”
URL
HotSpot-Ank¨undigung 1999
PARIS–(BUSINESS WIRE)–April 27, 1999
Sun Microsystems, Inc. today announced the release of the Java HotSpot(TM)
Performance Engine, the fastest software to date for Java(TM) technology
performance. The Java HotSpot performance engine breaks new ground in software
design and raises the bar by providing 100% higher performance than the previous Java
platform. The Java HotSpot Performance Engine will be available free of charge for
download at http://java.sun.com/products/hotspot/index.html.
”Java HotSpot Performance Engine turbocharges the Java 2 platform – performance is
no longer an issue,” said Jon Kannegaard, Vice President and General Manager, Java
Platform at Sun Microsystems, Inc.’s Java Software. This release maintains
uncompromising compatibility while dramatically boosting speed. It’s now the obvious
choice for deploying full-scale Java applications in the enterprise.”
URL
Compilers Everywhere
Just-in-Time-Compilation
Just-in-Time-Compilation
Bernd M¨uller 5.7.2018 11/48
Compilers Everywhere
Just-in-Time-Compilation
Hot-Spot-Compilation oder JIT-Compilation
Idee: Performanz h¨angt haupts¨achlich davon ab, wie schnell h¨aufig ausgef¨uhrter
Code ist
Bernd M¨uller 5.7.2018 12/48
Compilers Everywhere
Just-in-Time-Compilation
Hot-Spot-Compilation oder JIT-Compilation
Idee: Performanz h¨angt haupts¨achlich davon ab, wie schnell h¨aufig ausgef¨uhrter
Code ist
Daher: sp¨ate (nicht zum Programmstart), optionale Compilierung sinnvoll
Bernd M¨uller 5.7.2018 12/48
Compilers Everywhere
Just-in-Time-Compilation
Hot-Spot-Compilation oder JIT-Compilation
Idee: Performanz h¨angt haupts¨achlich davon ab, wie schnell h¨aufig ausgef¨uhrter
Code ist
Daher: sp¨ate (nicht zum Programmstart), optionale Compilierung sinnvoll
Compilierung ben¨otigt Zeit, diese evtl vergeudet, falls Code selten aufgerufen
Bernd M¨uller 5.7.2018 12/48
Compilers Everywhere
Just-in-Time-Compilation
Hot-Spot-Compilation oder JIT-Compilation
Idee: Performanz h¨angt haupts¨achlich davon ab, wie schnell h¨aufig ausgef¨uhrter
Code ist
Daher: sp¨ate (nicht zum Programmstart), optionale Compilierung sinnvoll
Compilierung ben¨otigt Zeit, diese evtl vergeudet, falls Code selten aufgerufen
JVM ben¨otigt Informationen ¨uber Ausf¨uhrung, um optimalen Code zu erzeugen
Bernd M¨uller 5.7.2018 12/48
Compilers Everywhere
Just-in-Time-Compilation
Hot-Spot-Compilation oder JIT-Compilation
Idee: Performanz h¨angt haupts¨achlich davon ab, wie schnell h¨aufig ausgef¨uhrter
Code ist
Daher: sp¨ate (nicht zum Programmstart), optionale Compilierung sinnvoll
Compilierung ben¨otigt Zeit, diese evtl vergeudet, falls Code selten aufgerufen
JVM ben¨otigt Informationen ¨uber Ausf¨uhrung, um optimalen Code zu erzeugen
Beispiel: obj1.equals(obj2)
Bernd M¨uller 5.7.2018 12/48
Compilers Everywhere
Just-in-Time-Compilation
Hot-Spot-Compilation oder JIT-Compilation
Idee: Performanz h¨angt haupts¨achlich davon ab, wie schnell h¨aufig ausgef¨uhrter
Code ist
Daher: sp¨ate (nicht zum Programmstart), optionale Compilierung sinnvoll
Compilierung ben¨otigt Zeit, diese evtl vergeudet, falls Code selten aufgerufen
JVM ben¨otigt Informationen ¨uber Ausf¨uhrung, um optimalen Code zu erzeugen
Beispiel: obj1.equals(obj2)
Falls obj1 die letzen Male immer String war, String.equals() verwenden und
nicht dynamisch dispatchen
Bernd M¨uller 5.7.2018 12/48
Compilers Everywhere
Just-in-Time-Compilation
Hot-Spot-Compilation oder JIT-Compilation
Idee: Performanz h¨angt haupts¨achlich davon ab, wie schnell h¨aufig ausgef¨uhrter
Code ist
Daher: sp¨ate (nicht zum Programmstart), optionale Compilierung sinnvoll
Compilierung ben¨otigt Zeit, diese evtl vergeudet, falls Code selten aufgerufen
JVM ben¨otigt Informationen ¨uber Ausf¨uhrung, um optimalen Code zu erzeugen
Beispiel: obj1.equals(obj2)
Falls obj1 die letzen Male immer String war, String.equals() verwenden und
nicht dynamisch dispatchen
Aber: obj1 k¨onnte mal von anderem Typ sein, muss also beobachtet werden
Bernd M¨uller 5.7.2018 12/48
Compilers Everywhere
Just-in-Time-Compilation
Die beiden JIT-Compiler
Client-Compiler, auch C1 genannt
Server-Compiler, auch C2 genannt
Warum zwei ?
Bernd M¨uller 5.7.2018 13/48
Compilers Everywhere
Just-in-Time-Compilation
Die beiden JIT-Compiler
Client-Compiler, auch C1 genannt
Server-Compiler, auch C2 genannt
Warum zwei ?
Client-Compiler optimiert, um Start-Up-Zeit zu minimieren
Server-Compiler optimiert, um auf lange Sicht bessere Performanz zu haben
Bernd M¨uller 5.7.2018 13/48
Compilers Everywhere
Just-in-Time-Compilation
Die beiden JIT-Compiler
Client-Compiler, auch C1 genannt
Server-Compiler, auch C2 genannt
Warum zwei ?
Client-Compiler optimiert, um Start-Up-Zeit zu minimieren
Server-Compiler optimiert, um auf lange Sicht bessere Performanz zu haben
Warum kann der Server-Compiler evtl. besser sein?
Bernd M¨uller 5.7.2018 13/48
Compilers Everywhere
Just-in-Time-Compilation
Die beiden JIT-Compiler
Client-Compiler, auch C1 genannt
Server-Compiler, auch C2 genannt
Warum zwei ?
Client-Compiler optimiert, um Start-Up-Zeit zu minimieren
Server-Compiler optimiert, um auf lange Sicht bessere Performanz zu haben
Warum kann der Server-Compiler evtl. besser sein?
Weil er den ausgef¨uhrten Code l¨anger beobachtet und gr¨undlicher analysiert hat und
damit gezieltere Optimierungen einbauen kann
Bernd M¨uller 5.7.2018 13/48
Compilers Everywhere
Tiered Compilation
Tiered Compilation
Bernd M¨uller 5.7.2018 14/48
Compilers Everywhere
Tiered Compilation
Tiered Compilation
Zu Beginn Client-Compiler verwenden, um schnellen Startup zu bekommen
Bernd M¨uller 5.7.2018 15/48
Compilers Everywhere
Tiered Compilation
Tiered Compilation
Zu Beginn Client-Compiler verwenden, um schnellen Startup zu bekommen
Wenn Code
”
hot“ wird und gen¨ugend Laufzeitinformationen gesammelt wurden,
nochmals durch Server-Compiler ¨ubersetzen
Bernd M¨uller 5.7.2018 15/48
Compilers Everywhere
Tiered Compilation
Tiered Compilation
Zu Beginn Client-Compiler verwenden, um schnellen Startup zu bekommen
Wenn Code
”
hot“ wird und gen¨ugend Laufzeitinformationen gesammelt wurden,
nochmals durch Server-Compiler ¨ubersetzen
Zu setzen mit -XX:+TieredCompilation
Bernd M¨uller 5.7.2018 15/48
Compilers Everywhere
Tiered Compilation
Tiered Compilation
Zu Beginn Client-Compiler verwenden, um schnellen Startup zu bekommen
Wenn Code
”
hot“ wird und gen¨ugend Laufzeitinformationen gesammelt wurden,
nochmals durch Server-Compiler ¨ubersetzen
Zu setzen mit -XX:+TieredCompilation
Seit Java 8 der Default
Bernd M¨uller 5.7.2018 15/48
Compilers Everywhere
Tiered Compilation
Tiered Compilation
Zu Beginn Client-Compiler verwenden, um schnellen Startup zu bekommen
Wenn Code
”
hot“ wird und gen¨ugend Laufzeitinformationen gesammelt wurden,
nochmals durch Server-Compiler ¨ubersetzen
Zu setzen mit -XX:+TieredCompilation
Seit Java 8 der Default
Tiered Compilation setzt Server-Compiler voraus.
java -client -XX:+TieredCompilation l¨auft daher ohne Tiered Compilation
Bernd M¨uller 5.7.2018 15/48
Compilers Everywhere
Tiered Compilation
2 Compiler — 5 Ausf¨uhrungs-Level (bei Tiered Compilation)
Level 0: interpreted code
Bernd M¨uller 5.7.2018 16/48
Compilers Everywhere
Tiered Compilation
2 Compiler — 5 Ausf¨uhrungs-Level (bei Tiered Compilation)
Level 0: interpreted code
Level 1: simple C1 compiled code (with no profiling)
Bernd M¨uller 5.7.2018 16/48
Compilers Everywhere
Tiered Compilation
2 Compiler — 5 Ausf¨uhrungs-Level (bei Tiered Compilation)
Level 0: interpreted code
Level 1: simple C1 compiled code (with no profiling)
Level 2: limited C1 compiled code (with light profiling)
Bernd M¨uller 5.7.2018 16/48
Compilers Everywhere
Tiered Compilation
2 Compiler — 5 Ausf¨uhrungs-Level (bei Tiered Compilation)
Level 0: interpreted code
Level 1: simple C1 compiled code (with no profiling)
Level 2: limited C1 compiled code (with light profiling)
Level 3: full C1 compiled code (with full profiling)
Bernd M¨uller 5.7.2018 16/48
Compilers Everywhere
Tiered Compilation
2 Compiler — 5 Ausf¨uhrungs-Level (bei Tiered Compilation)
Level 0: interpreted code
Level 1: simple C1 compiled code (with no profiling)
Level 2: limited C1 compiled code (with light profiling)
Level 3: full C1 compiled code (with full profiling)
Level 4: C2 compiled code (uses profile data from the previous steps)
Bernd M¨uller 5.7.2018 16/48
Compilers Everywhere
Tiered Compilation
2 Compiler — 5 Ausf¨uhrungs-Level (bei Tiered Compilation)
Level 0: interpreted code
Level 1: simple C1 compiled code (with no profiling)
Level 2: limited C1 compiled code (with light profiling)
Level 3: full C1 compiled code (with full profiling)
Level 4: C2 compiled code (uses profile data from the previous steps)
Normalerweise: 0 ⇒ 3 ⇒ 4
Bernd M¨uller 5.7.2018 16/48
Compilers Everywhere
Compilation Thresholds
Compilation Thresholds
Bernd M¨uller 5.7.2018 17/48
Compilers Everywhere
Compilation Thresholds
Compilation Thresholds
Was ist h¨aufig ausgef¨uhrter Code?
Bernd M¨uller 5.7.2018 18/48
Compilers Everywhere
Compilation Thresholds
Compilation Thresholds
Was ist h¨aufig ausgef¨uhrter Code?
Zwei Z¨ahler
Anzahl Aufrufe einer Methode
Anzahl R¨uckspr¨unge innerhalb einer Schleife
Setzen mit -XX:CompileThreshold=N
Setzen mit -XX:BackEdgeThreshold=N
Defaults in Client-Compiler: 1500 in Server-Compiler 10000
In der Regel selten bis nie zu ¨ander laut [Oaks], da mit diesen Werten Info f¨ur
optimale Compilierung vorhanden
Bernd M¨uller 5.7.2018 18/48
Compilers Everywhere
Compilation Thresholds
Nur zur Info ein paar Thresholds . . . (Java 8, 64 Bit)
intx CompileThreshold = 10000 {pd product}
uintx IncreaseFirstTierCompileThresholdAt = 50 {product}
intx Tier2CompileThreshold = 0 {product}
intx Tier3CompileThreshold = 2000 {product}
intx Tier4CompileThreshold = 15000 {product}
intx BackEdgeThreshold = 100000 {pd product}
intx Tier2BackEdgeThreshold = 0 {product}
intx Tier3BackEdgeThreshold = 60000 {product}
intx Tier4BackEdgeThreshold = 40000 {product}
Bei Interesse: advancedThresholdPolicy.hpp
Bernd M¨uller 5.7.2018 19/48
Compilers Everywhere
Inlining
Inlining
Bernd M¨uller 5.7.2018 20/48
Inlining
Code der aufzurufenden Methode/Funktion an Stelle des Aufrufs
Inlining
Code der aufzurufenden Methode/Funktion an Stelle des Aufrufs
bool C1ProfileInlinedCalls true C1 product
intx FreqInlineSize 325 pd product
bool IncrementalInline true C2 product
bool Inline true product
ccstr InlineDataFile product
intx InlineSmallCode 2000 pd product
bool InlineSynchronizedMethods true C1 product
intx MaxInlineLevel 9 product
intx MaxInlineSize 35 product
intx MaxRecursiveInlineLevel 1 product
intx Tier23InlineeNotifyFreqLog 20 product
bool UseInlineCaches true product
bool UseOnlyInlinedBimorphic true C2 product
Compilers Everywhere
On-Stack Replacement
On-Stack Replacement
Bernd M¨uller 5.7.2018 22/48
Compilers Everywhere
On-Stack Replacement
On-Stack Replacement
Was tun, wenn eine Methode eine Schleife enth¨alt, die sehr lange l¨auft?
Oder eine Schleife, die nie terminiert?
Bernd M¨uller 5.7.2018 23/48
Compilers Everywhere
On-Stack Replacement
On-Stack Replacement
Was tun, wenn eine Methode eine Schleife enth¨alt, die sehr lange l¨auft?
Oder eine Schleife, die nie terminiert?
Dann muss Schleife ¨ubersetzt werden, ohne auf den Methodenaufruf warten zu
k¨onnen
Bernd M¨uller 5.7.2018 23/48
Compilers Everywhere
On-Stack Replacement
On-Stack Replacement
Was tun, wenn eine Methode eine Schleife enth¨alt, die sehr lange l¨auft?
Oder eine Schleife, die nie terminiert?
Dann muss Schleife ¨ubersetzt werden, ohne auf den Methodenaufruf warten zu
k¨onnen
Wenn Back-EdgeThreshold erreicht, Compilation anstoßen
Bernd M¨uller 5.7.2018 23/48
Compilers Everywhere
On-Stack Replacement
On-Stack Replacement
Was tun, wenn eine Methode eine Schleife enth¨alt, die sehr lange l¨auft?
Oder eine Schleife, die nie terminiert?
Dann muss Schleife ¨ubersetzt werden, ohne auf den Methodenaufruf warten zu
k¨onnen
Wenn Back-EdgeThreshold erreicht, Compilation anstoßen
Und compilierte Version anstoßen, solange Schleife noch l¨auft
Bernd M¨uller 5.7.2018 23/48
Compilers Everywhere
Escape Analysis
Escape Analysis
Bernd M¨uller 5.7.2018 24/48
Compilers Everywhere
Escape Analysis
Escape Analysis
Jeder Heap-Zugriff erfolgt ¨uber Field-Name oder (Array-)Index
Bernd M¨uller 5.7.2018 25/48
Compilers Everywhere
Escape Analysis
Escape Analysis
Jeder Heap-Zugriff erfolgt ¨uber Field-Name oder (Array-)Index
Wenn Objekt in Methode erzeugt und nur dort verwendet wird, kann optimiert
werden
Bernd M¨uller 5.7.2018 25/48
Compilers Everywhere
Escape Analysis
Escape Analysis
Jeder Heap-Zugriff erfolgt ¨uber Field-Name oder (Array-)Index
Wenn Objekt in Methode erzeugt und nur dort verwendet wird, kann optimiert
werden
Man sagt:
”
the object does not escape“
Bernd M¨uller 5.7.2018 25/48
Compilers Everywhere
Escape Analysis
Escape Analysis
Jeder Heap-Zugriff erfolgt ¨uber Field-Name oder (Array-)Index
Wenn Objekt in Methode erzeugt und nur dort verwendet wird, kann optimiert
werden
Man sagt:
”
the object does not escape“
M¨ogliche Optimierungen:
Bernd M¨uller 5.7.2018 25/48
Compilers Everywhere
Escape Analysis
Escape Analysis
Jeder Heap-Zugriff erfolgt ¨uber Field-Name oder (Array-)Index
Wenn Objekt in Methode erzeugt und nur dort verwendet wird, kann optimiert
werden
Man sagt:
”
the object does not escape“
M¨ogliche Optimierungen:
Automatic Stack Allocation, damit kein GC n¨otig
Bernd M¨uller 5.7.2018 25/48
Compilers Everywhere
Escape Analysis
Escape Analysis
Jeder Heap-Zugriff erfolgt ¨uber Field-Name oder (Array-)Index
Wenn Objekt in Methode erzeugt und nur dort verwendet wird, kann optimiert
werden
Man sagt:
”
the object does not escape“
M¨ogliche Optimierungen:
Automatic Stack Allocation, damit kein GC n¨otig
Scalar Replacement, Fields auf Stack oder CPU-Register
Bernd M¨uller 5.7.2018 25/48
Compilers Everywhere
Escape Analysis
Escape Analysis
Jeder Heap-Zugriff erfolgt ¨uber Field-Name oder (Array-)Index
Wenn Objekt in Methode erzeugt und nur dort verwendet wird, kann optimiert
werden
Man sagt:
”
the object does not escape“
M¨ogliche Optimierungen:
Automatic Stack Allocation, damit kein GC n¨otig
Scalar Replacement, Fields auf Stack oder CPU-Register
Switch -XX:+DoEscapeAnalysis, Default seit 7u4
Bernd M¨uller 5.7.2018 25/48
Compilers Everywhere
Deoptimization
Deoptimization
Bernd M¨uller 5.7.2018 26/48
Compilers Everywhere
Deoptimization
Deoptimization
Manche (einige/viele) Optimierungen m¨ussen r¨uckg¨angig gemacht werden
Bernd M¨uller 5.7.2018 27/48
Compilers Everywhere
Deoptimization
Deoptimization
Manche (einige/viele) Optimierungen m¨ussen r¨uckg¨angig gemacht werden
Z.B. Unterklasse wird geladen, kann Methode ¨uberschreiben
Bernd M¨uller 5.7.2018 27/48
Compilers Everywhere
Deoptimization
Deoptimization
Manche (einige/viele) Optimierungen m¨ussen r¨uckg¨angig gemacht werden
Z.B. Unterklasse wird geladen, kann Methode ¨uberschreiben
N¨achste Tier hat compiliert (C2 muss C1-Code ersetzen)
Ausgaben im Log:
made not entrant
made zombie
Bernd M¨uller 5.7.2018 27/48
Compilers Everywhere
Informationen ¨uber den Compilier-Vorgang
Informationen ¨uber den Compilier-Vorgang
Bernd M¨uller 5.7.2018 28/48
Compilers Everywhere
Informationen ¨uber den Compilier-Vorgang
-XX:+PrintCompilation
java -XX:+PrintCompilation
Attribute:
%: On Stack Replacement
s: Method is synchronized
!: Method has Execption Handler
b: Compilation in Blocking Mode // nicht im Hintergrund
n: Compilation for Wrapper to native Method
Compilation Tier
Methodenname
Anzahl Bytes Byte-Code
Deoptimization (made not reentrant, made zombie)
Bernd M¨uller 5.7.2018 29/48
Compilers Everywhere
Informationen ¨uber den Compilier-Vorgang
-Xint und -Xcomp
-Xint: nur interpretieren
-Xcomp: alles sofort compilieren
Bernd M¨uller 5.7.2018 30/48
Compilers Everywhere
Informationen ¨uber den Compilier-Vorgang
-XX:+PrintInlining
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining
Zeigt Infos ¨uber Inlining (kleiner Methoden)
Durchaus nicht trivial (PrintFlagsFinal grep
”
Inline“)
Bernd M¨uller 5.7.2018 31/48
Compilers Everywhere
Informationen ¨uber den Compilier-Vorgang
java -XX:+CITime
java -XX:+CITime
Statistiken zur Compilierung werden nach JVM-Ende ausgegeben
Bernd M¨uller 5.7.2018 32/48
Compilers Everywhere
Informationen ¨uber den Compilier-Vorgang
-XX:+LogCompilation
java -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation
Sehr detaillierte Informationen werden in Datei hotspot pidXYZ.log geschrieben
Bernd M¨uller 5.7.2018 33/48
Compilers Everywhere
Informationen ¨uber den Compilier-Vorgang
-XX:+PrintOptoAssembly
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintOptoAssembly
Zeigt erzeugten Assembler an
Ben¨otigt Debug-VM
Bernd M¨uller 5.7.2018 34/48
Compilers Everywhere
Informationen ¨uber den Compilier-Vorgang
-XX:+CompileCommand=<method>
java -XX:+UnlockDiagnosticVMOptions
-XX:CompileCommand=print,*<class>.<method>
print: print assembly
inline: Versuch zu inlinen
exclude: diese Methode nicht compilieren
. . .
Bernd M¨uller 5.7.2018 35/48
Compilers Everywhere
Ahead of Time Compilation
Ahead of Time Compilation
Bernd M¨uller 5.7.2018 36/48
Compilers Everywhere
Ahead of Time Compilation
JEP 295: Ahead-of-Time Compilation
JEP 295: Ahead-of-Time Compilation
Bernd M¨uller 5.7.2018 37/48
Compilers Everywhere
Ahead of Time Compilation
JEP 295: Ahead-of-Time Compilation
JEP 295: Ahead-of-Time Compilation
Summary Compile Java classes to native code prior to launching the virtual
machine.
Bernd M¨uller 5.7.2018 37/48
Compilers Everywhere
Ahead of Time Compilation
Ahead-of-Time Compilation: so gehts!
Neuer Compiler jaotc ab JDK 9 (nur Linux)
Ab JDK 10 auch in Windows
Verwendung:
jaotc --output libWaste.so de.pdbm.Waste1
jaotc --output libjava.base.so --module java.base
java -XX:AOTLibrary=./libWaste.so,./libjava.base.so de.pdbm.Waste1
Bernd M¨uller 5.7.2018 38/48
Compilers Everywhere
Ahead of Time Compilation
Ahead-of-Time Compilation: so gehts!
Neuer Compiler jaotc ab JDK 9 (nur Linux)
Ab JDK 10 auch in Windows
Verwendung:
jaotc --output libWaste.so de.pdbm.Waste1
jaotc --output libjava.base.so --module java.base
java -XX:AOTLibrary=./libWaste.so,./libjava.base.so de.pdbm.Waste1
Compilieren des Basismoduls: 2+ Minuten, 323 MB
Bernd M¨uller 5.7.2018 38/48
Compilers Everywhere
Graal und Java Virtual Machine Compiler Interface (JVM CI)
Graal und Java Virtual Machine Compiler Interface (JVM CI)
Bernd M¨uller 5.7.2018 39/48
Compilers Everywhere
Graal und Java Virtual Machine Compiler Interface (JVM CI)
Java Virtual Machine Compiler Interface (JVM CI)
JEP 243: Java-Level JVM Compiler Interface
Summary Develop a Java based JVM compiler interface (JVMCI) enabling a
compiler written in Java to be used by the JVM as a dynamic compiler.
Bernd M¨uller 5.7.2018 40/48
Compilers Everywhere
Graal und Java Virtual Machine Compiler Interface (JVM CI)
Java Virtual Machine Compiler Interface (JVM CI)
JEP 243: Java-Level JVM Compiler Interface
Summary Develop a Java based JVM compiler interface (JVMCI) enabling a
compiler written in Java to be used by the JVM as a dynamic compiler.
Umgangssprachlich: Schreib deinen eigenen Compiler und
”
plug it in“
Bernd M¨uller 5.7.2018 40/48
Compilers Everywhere
Graal und Java Virtual Machine Compiler Interface (JVM CI)
Graal
C1 und C2 in JVM enthalten und in C++ geschrieben,
Bernd M¨uller 5.7.2018 41/48
Compilers Everywhere
Graal und Java Virtual Machine Compiler Interface (JVM CI)
Graal
C1 und C2 in JVM enthalten und in C++ geschrieben,
Einarbeitungs- und Wartungsaufwand Albtraum
Bernd M¨uller 5.7.2018 41/48
Compilers Everywhere
Graal und Java Virtual Machine Compiler Interface (JVM CI)
Graal
C1 und C2 in JVM enthalten und in C++ geschrieben,
Einarbeitungs- und Wartungsaufwand Albtraum
Neuer Compiler Graal in Java geschrieben
Bernd M¨uller 5.7.2018 41/48
Compilers Everywhere
Graal und Java Virtual Machine Compiler Interface (JVM CI)
Graal
C1 und C2 in JVM enthalten und in C++ geschrieben,
Einarbeitungs- und Wartungsaufwand Albtraum
Neuer Compiler Graal in Java geschrieben
JEP 317: Experimental Java-Based JIT Compiler
Bernd M¨uller 5.7.2018 41/48
Compilers Everywhere
Graal und Java Virtual Machine Compiler Interface (JVM CI)
Graal
C1 und C2 in JVM enthalten und in C++ geschrieben,
Einarbeitungs- und Wartungsaufwand Albtraum
Neuer Compiler Graal in Java geschrieben
JEP 317: Experimental Java-Based JIT Compiler
Integriert ¨uber allgemeines Java Virtual Machine Compiler Interface (JVM CI)
Bernd M¨uller 5.7.2018 41/48
Compilers Everywhere
Graal und Java Virtual Machine Compiler Interface (JVM CI)
Graal
C1 und C2 in JVM enthalten und in C++ geschrieben,
Einarbeitungs- und Wartungsaufwand Albtraum
Neuer Compiler Graal in Java geschrieben
JEP 317: Experimental Java-Based JIT Compiler
Integriert ¨uber allgemeines Java Virtual Machine Compiler Interface (JVM CI)
AOT bereits mit Graal realisiert, also in JDK 9 Linux enthalten
Bernd M¨uller 5.7.2018 41/48
Compilers Everywhere
Graal und Java Virtual Machine Compiler Interface (JVM CI)
Graal
C1 und C2 in JVM enthalten und in C++ geschrieben,
Einarbeitungs- und Wartungsaufwand Albtraum
Neuer Compiler Graal in Java geschrieben
JEP 317: Experimental Java-Based JIT Compiler
Integriert ¨uber allgemeines Java Virtual Machine Compiler Interface (JVM CI)
AOT bereits mit Graal realisiert, also in JDK 9 Linux enthalten
Ab JDK 10 offiziell (experimental) verwendbar:
-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler
Bernd M¨uller 5.7.2018 41/48
Compilers Everywhere
GraalVM
GraalVM
Bernd M¨uller 5.7.2018 42/48
Compilers Everywhere
GraalVM
GraalVM
https://www.graalvm.org/: GraalVM is a universal virtual machine for running
applications written in JavaScript, Python, Ruby, R, JVM-based languages like
Java, Scala, Kotlin, and LLVM-based languages such as C and C++.
Bernd M¨uller 5.7.2018 43/48
Compilers Everywhere
GraalVM
GraalVM
https://www.graalvm.org/: GraalVM is a universal virtual machine for running
applications written in JavaScript, Python, Ruby, R, JVM-based languages like
Java, Scala, Kotlin, and LLVM-based languages such as C and C++.
Modifizierte/erweiterte JVM mit Truffle und Substrate VM
Bernd M¨uller 5.7.2018 43/48
Compilers Everywhere
GraalVM
GraalVM
https://www.graalvm.org/: GraalVM is a universal virtual machine for running
applications written in JavaScript, Python, Ruby, R, JVM-based languages like
Java, Scala, Kotlin, and LLVM-based languages such as C and C++.
Modifizierte/erweiterte JVM mit Truffle und Substrate VM
Enth¨alt native-image: generate an image that contains ahead-of-time compiled
Java code
Bernd M¨uller 5.7.2018 43/48
Compilers Everywhere
GraalVM
GraalVM
https://www.graalvm.org/: GraalVM is a universal virtual machine for running
applications written in JavaScript, Python, Ruby, R, JVM-based languages like
Java, Scala, Kotlin, and LLVM-based languages such as C and C++.
Modifizierte/erweiterte JVM mit Truffle und Substrate VM
Enth¨alt native-image: generate an image that contains ahead-of-time compiled
Java code
Zu beachten:
Reflection (Graal SDK unterst¨utzt)
sun.misc.Unsafe: Field-Offsets m¨ussen im Image neu berechnet werden
Nicht vollst¨andiger Classpath: AOT muss alle referenzierten Klassen eager laden, um
¨ubersetzen zu k¨onnen. Ohne AOT kann Programm laufen, wirft aber evtl. Exception.
Kann mit Option --report-unsupported-elements-at-runtime verhindert
werden
Bernd M¨uller 5.7.2018 43/48
Compilers Everywhere
GraalVM
GraalVM native-image
native-image de.pdbm.HelloWorld
Compilierung: 10+ Sekunden, stand-alone Executable 5MB
Bernd M¨uller 5.7.2018 44/48
Compilers Everywhere
GraalVM
Es geht immer weiter . . .
Zum Abschluss die gute Nachricht — es geht immer weiter ;-)
JEP draft: JWarmup precompile java hot methods at application startup (5/2018)
Bernd M¨uller 5.7.2018 45/48
Compilers Everywhere
GraalVM
Es geht immer weiter . . .
Zum Abschluss die gute Nachricht — es geht immer weiter ;-)
JEP draft: JWarmup precompile java hot methods at application startup (5/2018)
Kurzgefasst:
Vor Produktion Testlauf, der Daten sammelt und speichert
Diese beim richtigen Lauf sofort f¨ur JIT nutzen
Produktion l¨auft dann mit nativem Code von Anfang an
Bernd M¨uller 5.7.2018 45/48
Compilers Everywhere
Und was nutzt mir das jetzt alles ?
Und was n¨utzt mir das jetzt alles ?
Seeing is believing . . . Demo Time !
Shell-Script zur Diagrammerzeugung:
Bernd M¨uller 5.7.2018 46/48
Compilers Everywhere
Fragen und Anmerkungen
Fragen und Anmerkungen
Bernd M¨uller 5.7.2018 47/48
Compilers Everywhere
Fragen und Anmerkungen
Referenzen
[Oaks] Scott Oaks, Java Performance — The Definitive Guide. O’Reilly, 2014.
Und Google ;-)
Bernd M¨uller 5.7.2018 48/48

More Related Content

Similar to Compilers Everywhere

Dnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbookDnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbookUlrich Krause
 
Intelligent Edge - breaking the storage hype (Michael Beeck, mibeeck GmbH)
Intelligent Edge - breaking the storage hype (Michael Beeck, mibeeck GmbH)Intelligent Edge - breaking the storage hype (Michael Beeck, mibeeck GmbH)
Intelligent Edge - breaking the storage hype (Michael Beeck, mibeeck GmbH)data://disrupted®
 
C/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersUlrich Krause
 
Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...
Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...
Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...Nico Orschel
 
Dataservices - Data Processing mit Microservices
Dataservices - Data Processing mit MicroservicesDataservices - Data Processing mit Microservices
Dataservices - Data Processing mit MicroservicesQAware GmbH
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreGregor Biswanger
 
Augmented Reality Workshop
Augmented Reality WorkshopAugmented Reality Workshop
Augmented Reality Workshopargency
 
Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...
Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...
Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...Mayflower GmbH
 
130605 buildfrei skalieren_fuer_bigdata
130605 buildfrei skalieren_fuer_bigdata130605 buildfrei skalieren_fuer_bigdata
130605 buildfrei skalieren_fuer_bigdataHenning Blohm
 
Wie baue ich eine KI, die besser als jeder Mensch ein Problem und dessen Ursa...
Wie baue ich eine KI, die besser als jeder Mensch ein Problem und dessen Ursa...Wie baue ich eine KI, die besser als jeder Mensch ein Problem und dessen Ursa...
Wie baue ich eine KI, die besser als jeder Mensch ein Problem und dessen Ursa...OPITZ CONSULTING Deutschland
 
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture LösungAndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture LösungEduard Hildebrandt
 
Enterprise Java Batch mit Spring
Enterprise Java Batch mit SpringEnterprise Java Batch mit Spring
Enterprise Java Batch mit Springdenschu
 
JUG Luzern: Open Source BPM mit BPMN 2.0 und Java
JUG Luzern: Open Source BPM mit BPMN 2.0 und JavaJUG Luzern: Open Source BPM mit BPMN 2.0 und Java
JUG Luzern: Open Source BPM mit BPMN 2.0 und Javacamunda services GmbH
 
W-JAX 2013 Spring Batch - Performance und Skalierbarkeit
W-JAX 2013 Spring Batch - Performance und SkalierbarkeitW-JAX 2013 Spring Batch - Performance und Skalierbarkeit
W-JAX 2013 Spring Batch - Performance und Skalierbarkeittobiasflohre
 
FMK2018- Virtuelle Server Peter Schubert
FMK2018- Virtuelle Server Peter SchubertFMK2018- Virtuelle Server Peter Schubert
FMK2018- Virtuelle Server Peter SchubertVerein FM Konferenz
 
OSMC 2010 | Verteiltes Monitoring by Martin Hefter
OSMC 2010 | Verteiltes Monitoring by Martin HefterOSMC 2010 | Verteiltes Monitoring by Martin Hefter
OSMC 2010 | Verteiltes Monitoring by Martin HefterNETWAYS
 

Similar to Compilers Everywhere (20)

Dnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbookDnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbook
 
Intelligent Edge - breaking the storage hype (Michael Beeck, mibeeck GmbH)
Intelligent Edge - breaking the storage hype (Michael Beeck, mibeeck GmbH)Intelligent Edge - breaking the storage hype (Michael Beeck, mibeeck GmbH)
Intelligent Edge - breaking the storage hype (Michael Beeck, mibeeck GmbH)
 
C/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino Developers
 
Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...
Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...
Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...
 
.NET und jetzt!
.NET und jetzt!.NET und jetzt!
.NET und jetzt!
 
Dataservices - Data Processing mit Microservices
Dataservices - Data Processing mit MicroservicesDataservices - Data Processing mit Microservices
Dataservices - Data Processing mit Microservices
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
 
CADFEM ihf Toolbox
CADFEM ihf ToolboxCADFEM ihf Toolbox
CADFEM ihf Toolbox
 
Augmented Reality Workshop
Augmented Reality WorkshopAugmented Reality Workshop
Augmented Reality Workshop
 
Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...
Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...
Commercial OS Shops - Magento, OXID, xt:commerce. Evaluationskriterien für En...
 
130605 buildfrei skalieren_fuer_bigdata
130605 buildfrei skalieren_fuer_bigdata130605 buildfrei skalieren_fuer_bigdata
130605 buildfrei skalieren_fuer_bigdata
 
Wie baue ich eine KI, die besser als jeder Mensch ein Problem und dessen Ursa...
Wie baue ich eine KI, die besser als jeder Mensch ein Problem und dessen Ursa...Wie baue ich eine KI, die besser als jeder Mensch ein Problem und dessen Ursa...
Wie baue ich eine KI, die besser als jeder Mensch ein Problem und dessen Ursa...
 
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture LösungAndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
 
Enterprise Java Batch mit Spring
Enterprise Java Batch mit SpringEnterprise Java Batch mit Spring
Enterprise Java Batch mit Spring
 
JUG Luzern: Open Source BPM mit BPMN 2.0 und Java
JUG Luzern: Open Source BPM mit BPMN 2.0 und JavaJUG Luzern: Open Source BPM mit BPMN 2.0 und Java
JUG Luzern: Open Source BPM mit BPMN 2.0 und Java
 
Team Foundation Server
Team Foundation ServerTeam Foundation Server
Team Foundation Server
 
W-JAX 2013 Spring Batch - Performance und Skalierbarkeit
W-JAX 2013 Spring Batch - Performance und SkalierbarkeitW-JAX 2013 Spring Batch - Performance und Skalierbarkeit
W-JAX 2013 Spring Batch - Performance und Skalierbarkeit
 
FMK2018- Virtuelle Server Peter Schubert
FMK2018- Virtuelle Server Peter SchubertFMK2018- Virtuelle Server Peter Schubert
FMK2018- Virtuelle Server Peter Schubert
 
OSMC 2010 | Verteiltes Monitoring by Martin Hefter
OSMC 2010 | Verteiltes Monitoring by Martin HefterOSMC 2010 | Verteiltes Monitoring by Martin Hefter
OSMC 2010 | Verteiltes Monitoring by Martin Hefter
 
.NET Gadgeteer
.NET Gadgeteer.NET Gadgeteer
.NET Gadgeteer
 

More from berndmueller

JFN 2017 - Instrumentierung - Das Werkzeug der Werkzeugmacher
JFN 2017 - Instrumentierung - Das Werkzeug der WerkzeugmacherJFN 2017 - Instrumentierung - Das Werkzeug der Werkzeugmacher
JFN 2017 - Instrumentierung - Das Werkzeug der Werkzeugmacherberndmueller
 
Was jeder Java-Entwickler über Strings wissen sollte
Was jeder Java-Entwickler über Strings wissen sollteWas jeder Java-Entwickler über Strings wissen sollte
Was jeder Java-Entwickler über Strings wissen sollteberndmueller
 
Drohnen und WARP-Antriebe
Drohnen und WARP-AntriebeDrohnen und WARP-Antriebe
Drohnen und WARP-Antriebeberndmueller
 
Hasta la vista Mandantenfähigkeit?
Hasta la vista Mandantenfähigkeit?Hasta la vista Mandantenfähigkeit?
Hasta la vista Mandantenfähigkeit?berndmueller
 
Class Loading Revisited
Class Loading RevisitedClass Loading Revisited
Class Loading Revisitedberndmueller
 
Instrumentierung - Das Werkzeug der Werkzeugmacher -
Instrumentierung - Das Werkzeug der Werkzeugmacher - Instrumentierung - Das Werkzeug der Werkzeugmacher -
Instrumentierung - Das Werkzeug der Werkzeugmacher - berndmueller
 
Was jeder Java-Entwickler über Strings wissen sollte
Was jeder Java-Entwickler über Strings wissen sollteWas jeder Java-Entwickler über Strings wissen sollte
Was jeder Java-Entwickler über Strings wissen sollteberndmueller
 

More from berndmueller (7)

JFN 2017 - Instrumentierung - Das Werkzeug der Werkzeugmacher
JFN 2017 - Instrumentierung - Das Werkzeug der WerkzeugmacherJFN 2017 - Instrumentierung - Das Werkzeug der Werkzeugmacher
JFN 2017 - Instrumentierung - Das Werkzeug der Werkzeugmacher
 
Was jeder Java-Entwickler über Strings wissen sollte
Was jeder Java-Entwickler über Strings wissen sollteWas jeder Java-Entwickler über Strings wissen sollte
Was jeder Java-Entwickler über Strings wissen sollte
 
Drohnen und WARP-Antriebe
Drohnen und WARP-AntriebeDrohnen und WARP-Antriebe
Drohnen und WARP-Antriebe
 
Hasta la vista Mandantenfähigkeit?
Hasta la vista Mandantenfähigkeit?Hasta la vista Mandantenfähigkeit?
Hasta la vista Mandantenfähigkeit?
 
Class Loading Revisited
Class Loading RevisitedClass Loading Revisited
Class Loading Revisited
 
Instrumentierung - Das Werkzeug der Werkzeugmacher -
Instrumentierung - Das Werkzeug der Werkzeugmacher - Instrumentierung - Das Werkzeug der Werkzeugmacher -
Instrumentierung - Das Werkzeug der Werkzeugmacher -
 
Was jeder Java-Entwickler über Strings wissen sollte
Was jeder Java-Entwickler über Strings wissen sollteWas jeder Java-Entwickler über Strings wissen sollte
Was jeder Java-Entwickler über Strings wissen sollte
 

Compilers Everywhere

  • 1. Compilers Everywhere Compilers Everywhere Bernd M¨uller Ostfalia Bernd M¨uller 5.7.2018 1/48
  • 2. Compilers Everywhere Vortragstypus ??? Nice to Know Bernd M¨uller 5.7.2018 2/48
  • 4. Compilers Everywhere Agenda Was ist Just-in-Time-Compilation ? Was der JIT-Compiler so alles macht VM-Schalter zum Selbstausprobieren . . . Ahead of Time Compilation Graal GraalVM (Demo) Bernd M¨uller 5.7.2018 3/48
  • 5. Compilers Everywhere Referent Vorstellung Referent Prof. Informatik (Ostfalia, HS Braunschweig/Wolfenb¨uttel) Buchautor (JSF, Seam, JPA, ...) Mitglied EGs JSR 344 (JSF 2.2) und JSR 338 (JPA 2.1) Gesch¨aftsf¨uhrer PMST GmbH JUG Ostfalen (Mitorganisator) . . . bernd.mueller@ostfalia.de @berndmuller Bernd M¨uller 5.7.2018 4/48
  • 6. Compilers Everywhere (Java) Compiler Basics (Java) Compiler Basics Bernd M¨uller 5.7.2018 5/48
  • 7. Compilers Everywhere (Java) Compiler Basics Compilers A compiler is a program that reads a program written in one programming language – the source language – and translates it into an equvalent program in another language – the target language. Bernd M¨uller 5.7.2018 6/48
  • 8. Compilers Everywhere (Java) Compiler Basics Compiler (from Wikipedia) . . . The translation process influences the design of computer languages which leads to a preference of compilation or interpretation. . . . In practice, an interpreter can be implemented for compiled languages and compilers can be implemented for interpreted languages. . . . https://en.wikipedia.org/wiki/Compiler Bernd M¨uller 5.7.2018 7/48
  • 9. Compilers Everywhere (Java) Compiler Basics Compiler (from Wikipedia) . . . The translation process influences the design of computer languages which leads to a preference of compilation or interpretation. . . . In practice, an interpreter can be implemented for compiled languages and compilers can be implemented for interpreted languages. . . . https://en.wikipedia.org/wiki/Compiler Bernd M¨uller 5.7.2018 7/48
  • 10. Compilers Everywhere (Java) Compiler Basics The Java Language: A White Paper / An Overview, 1995 Section Interpreted The Java interpreter can execute Java bytecodes directly on any machine to which the interpreter has been ported. And since linking is a more incremental and lightweight process, the development process can be much more rapid and exploratory. Bernd M¨uller 5.7.2018 8/48
  • 11. Compilers Everywhere (Java) Compiler Basics The Java Language: A White Paper / An Overview, 1995 Section High Performance While the performance of interpreted bytecodes is usually more than adequate, there are situations where higher performance is required. The bytecodes can be translated on the fly (at runtime) into machine code for the particular CPU the application is running on. For those accustomed to the normal design of a compiler and dynamic loader, this is somewhat like putting the final machine code generator in the dynamic loader. The bytecode format was designed with generating machine codes in mind, so the actual process of generating machine code is generally simple. In interpreted code we’re getting about 300,000 method calls per second on an Sun Microsystems SPARCStation 10. The performance of bytecodes converted to machine code is almost indistinguishable from native C or C++. Bernd M¨uller 5.7.2018 9/48
  • 12. Compilers Everywhere (Java) Compiler Basics The Java Language: A White Paper / An Overview, 1995 Section High Performance While the performance of interpreted bytecodes is usually more than adequate, there are situations where higher performance is required. The bytecodes can be translated on the fly (at runtime) into machine code for the particular CPU the application is running on. For those accustomed to the normal design of a compiler and dynamic loader, this is somewhat like putting the final machine code generator in the dynamic loader. The bytecode format was designed with generating machine codes in mind, so the actual process of generating machine code is generally simple. In interpreted code we’re getting about 300,000 method calls per second on an Sun Microsystems SPARCStation 10. The performance of bytecodes converted to machine code is almost indistinguishable from native C or C++. Bernd M¨uller 5.7.2018 9/48
  • 13. HotSpot-Ank¨undigung 1999 PARIS–(BUSINESS WIRE)–April 27, 1999 Sun Microsystems, Inc. today announced the release of the Java HotSpot(TM) Performance Engine, the fastest software to date for Java(TM) technology performance. The Java HotSpot performance engine breaks new ground in software design and raises the bar by providing 100% higher performance than the previous Java platform. The Java HotSpot Performance Engine will be available free of charge for download at http://java.sun.com/products/hotspot/index.html. ”Java HotSpot Performance Engine turbocharges the Java 2 platform – performance is no longer an issue,” said Jon Kannegaard, Vice President and General Manager, Java Platform at Sun Microsystems, Inc.’s Java Software. This release maintains uncompromising compatibility while dramatically boosting speed. It’s now the obvious choice for deploying full-scale Java applications in the enterprise.” URL
  • 14. HotSpot-Ank¨undigung 1999 PARIS–(BUSINESS WIRE)–April 27, 1999 Sun Microsystems, Inc. today announced the release of the Java HotSpot(TM) Performance Engine, the fastest software to date for Java(TM) technology performance. The Java HotSpot performance engine breaks new ground in software design and raises the bar by providing 100% higher performance than the previous Java platform. The Java HotSpot Performance Engine will be available free of charge for download at http://java.sun.com/products/hotspot/index.html. ”Java HotSpot Performance Engine turbocharges the Java 2 platform – performance is no longer an issue,” said Jon Kannegaard, Vice President and General Manager, Java Platform at Sun Microsystems, Inc.’s Java Software. This release maintains uncompromising compatibility while dramatically boosting speed. It’s now the obvious choice for deploying full-scale Java applications in the enterprise.” URL
  • 16. Compilers Everywhere Just-in-Time-Compilation Hot-Spot-Compilation oder JIT-Compilation Idee: Performanz h¨angt haupts¨achlich davon ab, wie schnell h¨aufig ausgef¨uhrter Code ist Bernd M¨uller 5.7.2018 12/48
  • 17. Compilers Everywhere Just-in-Time-Compilation Hot-Spot-Compilation oder JIT-Compilation Idee: Performanz h¨angt haupts¨achlich davon ab, wie schnell h¨aufig ausgef¨uhrter Code ist Daher: sp¨ate (nicht zum Programmstart), optionale Compilierung sinnvoll Bernd M¨uller 5.7.2018 12/48
  • 18. Compilers Everywhere Just-in-Time-Compilation Hot-Spot-Compilation oder JIT-Compilation Idee: Performanz h¨angt haupts¨achlich davon ab, wie schnell h¨aufig ausgef¨uhrter Code ist Daher: sp¨ate (nicht zum Programmstart), optionale Compilierung sinnvoll Compilierung ben¨otigt Zeit, diese evtl vergeudet, falls Code selten aufgerufen Bernd M¨uller 5.7.2018 12/48
  • 19. Compilers Everywhere Just-in-Time-Compilation Hot-Spot-Compilation oder JIT-Compilation Idee: Performanz h¨angt haupts¨achlich davon ab, wie schnell h¨aufig ausgef¨uhrter Code ist Daher: sp¨ate (nicht zum Programmstart), optionale Compilierung sinnvoll Compilierung ben¨otigt Zeit, diese evtl vergeudet, falls Code selten aufgerufen JVM ben¨otigt Informationen ¨uber Ausf¨uhrung, um optimalen Code zu erzeugen Bernd M¨uller 5.7.2018 12/48
  • 20. Compilers Everywhere Just-in-Time-Compilation Hot-Spot-Compilation oder JIT-Compilation Idee: Performanz h¨angt haupts¨achlich davon ab, wie schnell h¨aufig ausgef¨uhrter Code ist Daher: sp¨ate (nicht zum Programmstart), optionale Compilierung sinnvoll Compilierung ben¨otigt Zeit, diese evtl vergeudet, falls Code selten aufgerufen JVM ben¨otigt Informationen ¨uber Ausf¨uhrung, um optimalen Code zu erzeugen Beispiel: obj1.equals(obj2) Bernd M¨uller 5.7.2018 12/48
  • 21. Compilers Everywhere Just-in-Time-Compilation Hot-Spot-Compilation oder JIT-Compilation Idee: Performanz h¨angt haupts¨achlich davon ab, wie schnell h¨aufig ausgef¨uhrter Code ist Daher: sp¨ate (nicht zum Programmstart), optionale Compilierung sinnvoll Compilierung ben¨otigt Zeit, diese evtl vergeudet, falls Code selten aufgerufen JVM ben¨otigt Informationen ¨uber Ausf¨uhrung, um optimalen Code zu erzeugen Beispiel: obj1.equals(obj2) Falls obj1 die letzen Male immer String war, String.equals() verwenden und nicht dynamisch dispatchen Bernd M¨uller 5.7.2018 12/48
  • 22. Compilers Everywhere Just-in-Time-Compilation Hot-Spot-Compilation oder JIT-Compilation Idee: Performanz h¨angt haupts¨achlich davon ab, wie schnell h¨aufig ausgef¨uhrter Code ist Daher: sp¨ate (nicht zum Programmstart), optionale Compilierung sinnvoll Compilierung ben¨otigt Zeit, diese evtl vergeudet, falls Code selten aufgerufen JVM ben¨otigt Informationen ¨uber Ausf¨uhrung, um optimalen Code zu erzeugen Beispiel: obj1.equals(obj2) Falls obj1 die letzen Male immer String war, String.equals() verwenden und nicht dynamisch dispatchen Aber: obj1 k¨onnte mal von anderem Typ sein, muss also beobachtet werden Bernd M¨uller 5.7.2018 12/48
  • 23. Compilers Everywhere Just-in-Time-Compilation Die beiden JIT-Compiler Client-Compiler, auch C1 genannt Server-Compiler, auch C2 genannt Warum zwei ? Bernd M¨uller 5.7.2018 13/48
  • 24. Compilers Everywhere Just-in-Time-Compilation Die beiden JIT-Compiler Client-Compiler, auch C1 genannt Server-Compiler, auch C2 genannt Warum zwei ? Client-Compiler optimiert, um Start-Up-Zeit zu minimieren Server-Compiler optimiert, um auf lange Sicht bessere Performanz zu haben Bernd M¨uller 5.7.2018 13/48
  • 25. Compilers Everywhere Just-in-Time-Compilation Die beiden JIT-Compiler Client-Compiler, auch C1 genannt Server-Compiler, auch C2 genannt Warum zwei ? Client-Compiler optimiert, um Start-Up-Zeit zu minimieren Server-Compiler optimiert, um auf lange Sicht bessere Performanz zu haben Warum kann der Server-Compiler evtl. besser sein? Bernd M¨uller 5.7.2018 13/48
  • 26. Compilers Everywhere Just-in-Time-Compilation Die beiden JIT-Compiler Client-Compiler, auch C1 genannt Server-Compiler, auch C2 genannt Warum zwei ? Client-Compiler optimiert, um Start-Up-Zeit zu minimieren Server-Compiler optimiert, um auf lange Sicht bessere Performanz zu haben Warum kann der Server-Compiler evtl. besser sein? Weil er den ausgef¨uhrten Code l¨anger beobachtet und gr¨undlicher analysiert hat und damit gezieltere Optimierungen einbauen kann Bernd M¨uller 5.7.2018 13/48
  • 27. Compilers Everywhere Tiered Compilation Tiered Compilation Bernd M¨uller 5.7.2018 14/48
  • 28. Compilers Everywhere Tiered Compilation Tiered Compilation Zu Beginn Client-Compiler verwenden, um schnellen Startup zu bekommen Bernd M¨uller 5.7.2018 15/48
  • 29. Compilers Everywhere Tiered Compilation Tiered Compilation Zu Beginn Client-Compiler verwenden, um schnellen Startup zu bekommen Wenn Code ” hot“ wird und gen¨ugend Laufzeitinformationen gesammelt wurden, nochmals durch Server-Compiler ¨ubersetzen Bernd M¨uller 5.7.2018 15/48
  • 30. Compilers Everywhere Tiered Compilation Tiered Compilation Zu Beginn Client-Compiler verwenden, um schnellen Startup zu bekommen Wenn Code ” hot“ wird und gen¨ugend Laufzeitinformationen gesammelt wurden, nochmals durch Server-Compiler ¨ubersetzen Zu setzen mit -XX:+TieredCompilation Bernd M¨uller 5.7.2018 15/48
  • 31. Compilers Everywhere Tiered Compilation Tiered Compilation Zu Beginn Client-Compiler verwenden, um schnellen Startup zu bekommen Wenn Code ” hot“ wird und gen¨ugend Laufzeitinformationen gesammelt wurden, nochmals durch Server-Compiler ¨ubersetzen Zu setzen mit -XX:+TieredCompilation Seit Java 8 der Default Bernd M¨uller 5.7.2018 15/48
  • 32. Compilers Everywhere Tiered Compilation Tiered Compilation Zu Beginn Client-Compiler verwenden, um schnellen Startup zu bekommen Wenn Code ” hot“ wird und gen¨ugend Laufzeitinformationen gesammelt wurden, nochmals durch Server-Compiler ¨ubersetzen Zu setzen mit -XX:+TieredCompilation Seit Java 8 der Default Tiered Compilation setzt Server-Compiler voraus. java -client -XX:+TieredCompilation l¨auft daher ohne Tiered Compilation Bernd M¨uller 5.7.2018 15/48
  • 33. Compilers Everywhere Tiered Compilation 2 Compiler — 5 Ausf¨uhrungs-Level (bei Tiered Compilation) Level 0: interpreted code Bernd M¨uller 5.7.2018 16/48
  • 34. Compilers Everywhere Tiered Compilation 2 Compiler — 5 Ausf¨uhrungs-Level (bei Tiered Compilation) Level 0: interpreted code Level 1: simple C1 compiled code (with no profiling) Bernd M¨uller 5.7.2018 16/48
  • 35. Compilers Everywhere Tiered Compilation 2 Compiler — 5 Ausf¨uhrungs-Level (bei Tiered Compilation) Level 0: interpreted code Level 1: simple C1 compiled code (with no profiling) Level 2: limited C1 compiled code (with light profiling) Bernd M¨uller 5.7.2018 16/48
  • 36. Compilers Everywhere Tiered Compilation 2 Compiler — 5 Ausf¨uhrungs-Level (bei Tiered Compilation) Level 0: interpreted code Level 1: simple C1 compiled code (with no profiling) Level 2: limited C1 compiled code (with light profiling) Level 3: full C1 compiled code (with full profiling) Bernd M¨uller 5.7.2018 16/48
  • 37. Compilers Everywhere Tiered Compilation 2 Compiler — 5 Ausf¨uhrungs-Level (bei Tiered Compilation) Level 0: interpreted code Level 1: simple C1 compiled code (with no profiling) Level 2: limited C1 compiled code (with light profiling) Level 3: full C1 compiled code (with full profiling) Level 4: C2 compiled code (uses profile data from the previous steps) Bernd M¨uller 5.7.2018 16/48
  • 38. Compilers Everywhere Tiered Compilation 2 Compiler — 5 Ausf¨uhrungs-Level (bei Tiered Compilation) Level 0: interpreted code Level 1: simple C1 compiled code (with no profiling) Level 2: limited C1 compiled code (with light profiling) Level 3: full C1 compiled code (with full profiling) Level 4: C2 compiled code (uses profile data from the previous steps) Normalerweise: 0 ⇒ 3 ⇒ 4 Bernd M¨uller 5.7.2018 16/48
  • 39. Compilers Everywhere Compilation Thresholds Compilation Thresholds Bernd M¨uller 5.7.2018 17/48
  • 40. Compilers Everywhere Compilation Thresholds Compilation Thresholds Was ist h¨aufig ausgef¨uhrter Code? Bernd M¨uller 5.7.2018 18/48
  • 41. Compilers Everywhere Compilation Thresholds Compilation Thresholds Was ist h¨aufig ausgef¨uhrter Code? Zwei Z¨ahler Anzahl Aufrufe einer Methode Anzahl R¨uckspr¨unge innerhalb einer Schleife Setzen mit -XX:CompileThreshold=N Setzen mit -XX:BackEdgeThreshold=N Defaults in Client-Compiler: 1500 in Server-Compiler 10000 In der Regel selten bis nie zu ¨ander laut [Oaks], da mit diesen Werten Info f¨ur optimale Compilierung vorhanden Bernd M¨uller 5.7.2018 18/48
  • 42. Compilers Everywhere Compilation Thresholds Nur zur Info ein paar Thresholds . . . (Java 8, 64 Bit) intx CompileThreshold = 10000 {pd product} uintx IncreaseFirstTierCompileThresholdAt = 50 {product} intx Tier2CompileThreshold = 0 {product} intx Tier3CompileThreshold = 2000 {product} intx Tier4CompileThreshold = 15000 {product} intx BackEdgeThreshold = 100000 {pd product} intx Tier2BackEdgeThreshold = 0 {product} intx Tier3BackEdgeThreshold = 60000 {product} intx Tier4BackEdgeThreshold = 40000 {product} Bei Interesse: advancedThresholdPolicy.hpp Bernd M¨uller 5.7.2018 19/48
  • 44. Inlining Code der aufzurufenden Methode/Funktion an Stelle des Aufrufs
  • 45. Inlining Code der aufzurufenden Methode/Funktion an Stelle des Aufrufs bool C1ProfileInlinedCalls true C1 product intx FreqInlineSize 325 pd product bool IncrementalInline true C2 product bool Inline true product ccstr InlineDataFile product intx InlineSmallCode 2000 pd product bool InlineSynchronizedMethods true C1 product intx MaxInlineLevel 9 product intx MaxInlineSize 35 product intx MaxRecursiveInlineLevel 1 product intx Tier23InlineeNotifyFreqLog 20 product bool UseInlineCaches true product bool UseOnlyInlinedBimorphic true C2 product
  • 46. Compilers Everywhere On-Stack Replacement On-Stack Replacement Bernd M¨uller 5.7.2018 22/48
  • 47. Compilers Everywhere On-Stack Replacement On-Stack Replacement Was tun, wenn eine Methode eine Schleife enth¨alt, die sehr lange l¨auft? Oder eine Schleife, die nie terminiert? Bernd M¨uller 5.7.2018 23/48
  • 48. Compilers Everywhere On-Stack Replacement On-Stack Replacement Was tun, wenn eine Methode eine Schleife enth¨alt, die sehr lange l¨auft? Oder eine Schleife, die nie terminiert? Dann muss Schleife ¨ubersetzt werden, ohne auf den Methodenaufruf warten zu k¨onnen Bernd M¨uller 5.7.2018 23/48
  • 49. Compilers Everywhere On-Stack Replacement On-Stack Replacement Was tun, wenn eine Methode eine Schleife enth¨alt, die sehr lange l¨auft? Oder eine Schleife, die nie terminiert? Dann muss Schleife ¨ubersetzt werden, ohne auf den Methodenaufruf warten zu k¨onnen Wenn Back-EdgeThreshold erreicht, Compilation anstoßen Bernd M¨uller 5.7.2018 23/48
  • 50. Compilers Everywhere On-Stack Replacement On-Stack Replacement Was tun, wenn eine Methode eine Schleife enth¨alt, die sehr lange l¨auft? Oder eine Schleife, die nie terminiert? Dann muss Schleife ¨ubersetzt werden, ohne auf den Methodenaufruf warten zu k¨onnen Wenn Back-EdgeThreshold erreicht, Compilation anstoßen Und compilierte Version anstoßen, solange Schleife noch l¨auft Bernd M¨uller 5.7.2018 23/48
  • 51. Compilers Everywhere Escape Analysis Escape Analysis Bernd M¨uller 5.7.2018 24/48
  • 52. Compilers Everywhere Escape Analysis Escape Analysis Jeder Heap-Zugriff erfolgt ¨uber Field-Name oder (Array-)Index Bernd M¨uller 5.7.2018 25/48
  • 53. Compilers Everywhere Escape Analysis Escape Analysis Jeder Heap-Zugriff erfolgt ¨uber Field-Name oder (Array-)Index Wenn Objekt in Methode erzeugt und nur dort verwendet wird, kann optimiert werden Bernd M¨uller 5.7.2018 25/48
  • 54. Compilers Everywhere Escape Analysis Escape Analysis Jeder Heap-Zugriff erfolgt ¨uber Field-Name oder (Array-)Index Wenn Objekt in Methode erzeugt und nur dort verwendet wird, kann optimiert werden Man sagt: ” the object does not escape“ Bernd M¨uller 5.7.2018 25/48
  • 55. Compilers Everywhere Escape Analysis Escape Analysis Jeder Heap-Zugriff erfolgt ¨uber Field-Name oder (Array-)Index Wenn Objekt in Methode erzeugt und nur dort verwendet wird, kann optimiert werden Man sagt: ” the object does not escape“ M¨ogliche Optimierungen: Bernd M¨uller 5.7.2018 25/48
  • 56. Compilers Everywhere Escape Analysis Escape Analysis Jeder Heap-Zugriff erfolgt ¨uber Field-Name oder (Array-)Index Wenn Objekt in Methode erzeugt und nur dort verwendet wird, kann optimiert werden Man sagt: ” the object does not escape“ M¨ogliche Optimierungen: Automatic Stack Allocation, damit kein GC n¨otig Bernd M¨uller 5.7.2018 25/48
  • 57. Compilers Everywhere Escape Analysis Escape Analysis Jeder Heap-Zugriff erfolgt ¨uber Field-Name oder (Array-)Index Wenn Objekt in Methode erzeugt und nur dort verwendet wird, kann optimiert werden Man sagt: ” the object does not escape“ M¨ogliche Optimierungen: Automatic Stack Allocation, damit kein GC n¨otig Scalar Replacement, Fields auf Stack oder CPU-Register Bernd M¨uller 5.7.2018 25/48
  • 58. Compilers Everywhere Escape Analysis Escape Analysis Jeder Heap-Zugriff erfolgt ¨uber Field-Name oder (Array-)Index Wenn Objekt in Methode erzeugt und nur dort verwendet wird, kann optimiert werden Man sagt: ” the object does not escape“ M¨ogliche Optimierungen: Automatic Stack Allocation, damit kein GC n¨otig Scalar Replacement, Fields auf Stack oder CPU-Register Switch -XX:+DoEscapeAnalysis, Default seit 7u4 Bernd M¨uller 5.7.2018 25/48
  • 60. Compilers Everywhere Deoptimization Deoptimization Manche (einige/viele) Optimierungen m¨ussen r¨uckg¨angig gemacht werden Bernd M¨uller 5.7.2018 27/48
  • 61. Compilers Everywhere Deoptimization Deoptimization Manche (einige/viele) Optimierungen m¨ussen r¨uckg¨angig gemacht werden Z.B. Unterklasse wird geladen, kann Methode ¨uberschreiben Bernd M¨uller 5.7.2018 27/48
  • 62. Compilers Everywhere Deoptimization Deoptimization Manche (einige/viele) Optimierungen m¨ussen r¨uckg¨angig gemacht werden Z.B. Unterklasse wird geladen, kann Methode ¨uberschreiben N¨achste Tier hat compiliert (C2 muss C1-Code ersetzen) Ausgaben im Log: made not entrant made zombie Bernd M¨uller 5.7.2018 27/48
  • 63. Compilers Everywhere Informationen ¨uber den Compilier-Vorgang Informationen ¨uber den Compilier-Vorgang Bernd M¨uller 5.7.2018 28/48
  • 64. Compilers Everywhere Informationen ¨uber den Compilier-Vorgang -XX:+PrintCompilation java -XX:+PrintCompilation Attribute: %: On Stack Replacement s: Method is synchronized !: Method has Execption Handler b: Compilation in Blocking Mode // nicht im Hintergrund n: Compilation for Wrapper to native Method Compilation Tier Methodenname Anzahl Bytes Byte-Code Deoptimization (made not reentrant, made zombie) Bernd M¨uller 5.7.2018 29/48
  • 65. Compilers Everywhere Informationen ¨uber den Compilier-Vorgang -Xint und -Xcomp -Xint: nur interpretieren -Xcomp: alles sofort compilieren Bernd M¨uller 5.7.2018 30/48
  • 66. Compilers Everywhere Informationen ¨uber den Compilier-Vorgang -XX:+PrintInlining java -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining Zeigt Infos ¨uber Inlining (kleiner Methoden) Durchaus nicht trivial (PrintFlagsFinal grep ” Inline“) Bernd M¨uller 5.7.2018 31/48
  • 67. Compilers Everywhere Informationen ¨uber den Compilier-Vorgang java -XX:+CITime java -XX:+CITime Statistiken zur Compilierung werden nach JVM-Ende ausgegeben Bernd M¨uller 5.7.2018 32/48
  • 68. Compilers Everywhere Informationen ¨uber den Compilier-Vorgang -XX:+LogCompilation java -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation Sehr detaillierte Informationen werden in Datei hotspot pidXYZ.log geschrieben Bernd M¨uller 5.7.2018 33/48
  • 69. Compilers Everywhere Informationen ¨uber den Compilier-Vorgang -XX:+PrintOptoAssembly java -XX:+UnlockDiagnosticVMOptions -XX:+PrintOptoAssembly Zeigt erzeugten Assembler an Ben¨otigt Debug-VM Bernd M¨uller 5.7.2018 34/48
  • 70. Compilers Everywhere Informationen ¨uber den Compilier-Vorgang -XX:+CompileCommand=<method> java -XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*<class>.<method> print: print assembly inline: Versuch zu inlinen exclude: diese Methode nicht compilieren . . . Bernd M¨uller 5.7.2018 35/48
  • 71. Compilers Everywhere Ahead of Time Compilation Ahead of Time Compilation Bernd M¨uller 5.7.2018 36/48
  • 72. Compilers Everywhere Ahead of Time Compilation JEP 295: Ahead-of-Time Compilation JEP 295: Ahead-of-Time Compilation Bernd M¨uller 5.7.2018 37/48
  • 73. Compilers Everywhere Ahead of Time Compilation JEP 295: Ahead-of-Time Compilation JEP 295: Ahead-of-Time Compilation Summary Compile Java classes to native code prior to launching the virtual machine. Bernd M¨uller 5.7.2018 37/48
  • 74. Compilers Everywhere Ahead of Time Compilation Ahead-of-Time Compilation: so gehts! Neuer Compiler jaotc ab JDK 9 (nur Linux) Ab JDK 10 auch in Windows Verwendung: jaotc --output libWaste.so de.pdbm.Waste1 jaotc --output libjava.base.so --module java.base java -XX:AOTLibrary=./libWaste.so,./libjava.base.so de.pdbm.Waste1 Bernd M¨uller 5.7.2018 38/48
  • 75. Compilers Everywhere Ahead of Time Compilation Ahead-of-Time Compilation: so gehts! Neuer Compiler jaotc ab JDK 9 (nur Linux) Ab JDK 10 auch in Windows Verwendung: jaotc --output libWaste.so de.pdbm.Waste1 jaotc --output libjava.base.so --module java.base java -XX:AOTLibrary=./libWaste.so,./libjava.base.so de.pdbm.Waste1 Compilieren des Basismoduls: 2+ Minuten, 323 MB Bernd M¨uller 5.7.2018 38/48
  • 76. Compilers Everywhere Graal und Java Virtual Machine Compiler Interface (JVM CI) Graal und Java Virtual Machine Compiler Interface (JVM CI) Bernd M¨uller 5.7.2018 39/48
  • 77. Compilers Everywhere Graal und Java Virtual Machine Compiler Interface (JVM CI) Java Virtual Machine Compiler Interface (JVM CI) JEP 243: Java-Level JVM Compiler Interface Summary Develop a Java based JVM compiler interface (JVMCI) enabling a compiler written in Java to be used by the JVM as a dynamic compiler. Bernd M¨uller 5.7.2018 40/48
  • 78. Compilers Everywhere Graal und Java Virtual Machine Compiler Interface (JVM CI) Java Virtual Machine Compiler Interface (JVM CI) JEP 243: Java-Level JVM Compiler Interface Summary Develop a Java based JVM compiler interface (JVMCI) enabling a compiler written in Java to be used by the JVM as a dynamic compiler. Umgangssprachlich: Schreib deinen eigenen Compiler und ” plug it in“ Bernd M¨uller 5.7.2018 40/48
  • 79. Compilers Everywhere Graal und Java Virtual Machine Compiler Interface (JVM CI) Graal C1 und C2 in JVM enthalten und in C++ geschrieben, Bernd M¨uller 5.7.2018 41/48
  • 80. Compilers Everywhere Graal und Java Virtual Machine Compiler Interface (JVM CI) Graal C1 und C2 in JVM enthalten und in C++ geschrieben, Einarbeitungs- und Wartungsaufwand Albtraum Bernd M¨uller 5.7.2018 41/48
  • 81. Compilers Everywhere Graal und Java Virtual Machine Compiler Interface (JVM CI) Graal C1 und C2 in JVM enthalten und in C++ geschrieben, Einarbeitungs- und Wartungsaufwand Albtraum Neuer Compiler Graal in Java geschrieben Bernd M¨uller 5.7.2018 41/48
  • 82. Compilers Everywhere Graal und Java Virtual Machine Compiler Interface (JVM CI) Graal C1 und C2 in JVM enthalten und in C++ geschrieben, Einarbeitungs- und Wartungsaufwand Albtraum Neuer Compiler Graal in Java geschrieben JEP 317: Experimental Java-Based JIT Compiler Bernd M¨uller 5.7.2018 41/48
  • 83. Compilers Everywhere Graal und Java Virtual Machine Compiler Interface (JVM CI) Graal C1 und C2 in JVM enthalten und in C++ geschrieben, Einarbeitungs- und Wartungsaufwand Albtraum Neuer Compiler Graal in Java geschrieben JEP 317: Experimental Java-Based JIT Compiler Integriert ¨uber allgemeines Java Virtual Machine Compiler Interface (JVM CI) Bernd M¨uller 5.7.2018 41/48
  • 84. Compilers Everywhere Graal und Java Virtual Machine Compiler Interface (JVM CI) Graal C1 und C2 in JVM enthalten und in C++ geschrieben, Einarbeitungs- und Wartungsaufwand Albtraum Neuer Compiler Graal in Java geschrieben JEP 317: Experimental Java-Based JIT Compiler Integriert ¨uber allgemeines Java Virtual Machine Compiler Interface (JVM CI) AOT bereits mit Graal realisiert, also in JDK 9 Linux enthalten Bernd M¨uller 5.7.2018 41/48
  • 85. Compilers Everywhere Graal und Java Virtual Machine Compiler Interface (JVM CI) Graal C1 und C2 in JVM enthalten und in C++ geschrieben, Einarbeitungs- und Wartungsaufwand Albtraum Neuer Compiler Graal in Java geschrieben JEP 317: Experimental Java-Based JIT Compiler Integriert ¨uber allgemeines Java Virtual Machine Compiler Interface (JVM CI) AOT bereits mit Graal realisiert, also in JDK 9 Linux enthalten Ab JDK 10 offiziell (experimental) verwendbar: -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler Bernd M¨uller 5.7.2018 41/48
  • 87. Compilers Everywhere GraalVM GraalVM https://www.graalvm.org/: GraalVM is a universal virtual machine for running applications written in JavaScript, Python, Ruby, R, JVM-based languages like Java, Scala, Kotlin, and LLVM-based languages such as C and C++. Bernd M¨uller 5.7.2018 43/48
  • 88. Compilers Everywhere GraalVM GraalVM https://www.graalvm.org/: GraalVM is a universal virtual machine for running applications written in JavaScript, Python, Ruby, R, JVM-based languages like Java, Scala, Kotlin, and LLVM-based languages such as C and C++. Modifizierte/erweiterte JVM mit Truffle und Substrate VM Bernd M¨uller 5.7.2018 43/48
  • 89. Compilers Everywhere GraalVM GraalVM https://www.graalvm.org/: GraalVM is a universal virtual machine for running applications written in JavaScript, Python, Ruby, R, JVM-based languages like Java, Scala, Kotlin, and LLVM-based languages such as C and C++. Modifizierte/erweiterte JVM mit Truffle und Substrate VM Enth¨alt native-image: generate an image that contains ahead-of-time compiled Java code Bernd M¨uller 5.7.2018 43/48
  • 90. Compilers Everywhere GraalVM GraalVM https://www.graalvm.org/: GraalVM is a universal virtual machine for running applications written in JavaScript, Python, Ruby, R, JVM-based languages like Java, Scala, Kotlin, and LLVM-based languages such as C and C++. Modifizierte/erweiterte JVM mit Truffle und Substrate VM Enth¨alt native-image: generate an image that contains ahead-of-time compiled Java code Zu beachten: Reflection (Graal SDK unterst¨utzt) sun.misc.Unsafe: Field-Offsets m¨ussen im Image neu berechnet werden Nicht vollst¨andiger Classpath: AOT muss alle referenzierten Klassen eager laden, um ¨ubersetzen zu k¨onnen. Ohne AOT kann Programm laufen, wirft aber evtl. Exception. Kann mit Option --report-unsupported-elements-at-runtime verhindert werden Bernd M¨uller 5.7.2018 43/48
  • 91. Compilers Everywhere GraalVM GraalVM native-image native-image de.pdbm.HelloWorld Compilierung: 10+ Sekunden, stand-alone Executable 5MB Bernd M¨uller 5.7.2018 44/48
  • 92. Compilers Everywhere GraalVM Es geht immer weiter . . . Zum Abschluss die gute Nachricht — es geht immer weiter ;-) JEP draft: JWarmup precompile java hot methods at application startup (5/2018) Bernd M¨uller 5.7.2018 45/48
  • 93. Compilers Everywhere GraalVM Es geht immer weiter . . . Zum Abschluss die gute Nachricht — es geht immer weiter ;-) JEP draft: JWarmup precompile java hot methods at application startup (5/2018) Kurzgefasst: Vor Produktion Testlauf, der Daten sammelt und speichert Diese beim richtigen Lauf sofort f¨ur JIT nutzen Produktion l¨auft dann mit nativem Code von Anfang an Bernd M¨uller 5.7.2018 45/48
  • 94. Compilers Everywhere Und was nutzt mir das jetzt alles ? Und was n¨utzt mir das jetzt alles ? Seeing is believing . . . Demo Time ! Shell-Script zur Diagrammerzeugung: Bernd M¨uller 5.7.2018 46/48
  • 95. Compilers Everywhere Fragen und Anmerkungen Fragen und Anmerkungen Bernd M¨uller 5.7.2018 47/48
  • 96. Compilers Everywhere Fragen und Anmerkungen Referenzen [Oaks] Scott Oaks, Java Performance — The Definitive Guide. O’Reilly, 2014. Und Google ;-) Bernd M¨uller 5.7.2018 48/48