SlideShare a Scribd company logo
1 of 87
Download to read offline
READYNOW
DOUGLAS Q. HAWKINS
LEAD JIT DEVELOPER
AZUL SYSTEMS
@dougqh
dhawkins@azul.com
AZUL’S UNCONVENTIONAL “AOT”
ACKNOWLEDGEMENTS
Compiler Team
Runtime Team
GC Team
Perf Team
QA
Especially…
Ivan Krylov
Igor Laevsky
Artur Pilipenko
Roman Shirokiy
Vladimir Voskeresensky
2
ABOUT AZUL ZING
Derived from HotSpot
Known for C4 “Pauseless” GC
Popular with Financial Customers
R
3
READYNOW’S ORIGINAL PURPOSE
Originated from requests
from our existing financial
customers
Eliminate Warm-up
First transaction is critical
No loss of peak performance
Eliminate volatility
No artificial load
Expanding out into
other user applications
4
START FAST!
STAY FAST!
5
START WARMED-UP
Just-in-Time is
Slightly Too Late
Need Something…
Proactive
Not Reactive0
400
800
1200
1600
warm-up 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
ops/min
XML validation benchmark
5 mins
6
NO MINIMAL LOSS OF THROUGHPUT
+30%
0
400
800
1200
1600
warm-up 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Speculative Optimizations Enabled Disabled
≅80Discarded
Compilations
*
* out of 800 optimized tier compilations
ops/min
5 mins
7
non-sampling
period
sampling
period
full-speed
period
C2
C1Interpreter
time
C1
C2
additional
sampling
period
stable
period
Trap + Bail to Interpreter
5x
10-100+x
SIMPLIFIED CYCLE OF OPENJDK
8 https://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
ACTUAL OPENJDK TIERING SYSTEM
0: Interpreter 1-3: C1 4: C2
1: No overhead 2: Counters 3: Counters +
Profiling
0
0
0
3
3
31
2
4
4
Normal Flow
Start-up Flow
(C2 Busy)
Trivial Method
Flow
9 https://www.slideshare.net/maddocig/tiered
ZING TIERING SYSTEM
Interpreter C1 C2 / Falcon
0 3 4
OpenJDK
Normal Flow
Zing Flow
Interpreter Baseline Optimized
10
5 mins
transactiontime/latency
Invidual XML validation results
10
100
1000
0
C1 C2 / Falcon C2 / Falcon Not Entrantcount
11
12
EVENTUALLY, WE’LL SEE...transactiontime/latency
5 mins
Original With ReadyNow
UNCONVENTIONAL
APPROACH
BUT “NATURAL” FOR HOTSPOT
13
ORIGINAL RUN SUBSEQUENT RUNS
AT A *VERY HIGH* LEVEL
14
MORE LIKE TRADITIONAL
PROFILE GUIDED OPTIMIZATION
hpp GCCCompile
Execute
& Profile
cpp
prof
hpp
Profile Guided
Compile cpp
GCCprof
+
instrumented
exe
instrumented
exe
optimized
exe
15
...
AOT
JIT Cache
READYNOW ISN’T...
Compilation Log
Profile Cache
Add-on to existing
compilers: C1 & C2
READYNOW IS
16
COMPILATION LOG
Interpreter C1 C2 / Falcon
C1Compilation foo.Bar::baz
C2Compilation foo.Bar::baz
…
17
Concatenative transaction log
UPSERT-s into a database
Grows with each compilation
Plain text - uncompressed
Backwards Compatible
Accidentally similar to CI Replay
10-100 MiB
on disk
CONCATENATIVE TRANSACTION LOG
10-50 MiB
from native
memory
18
Interpreter C1
Profile
C2 / Falcon
ZING PROFILING
19
Interpreter C1
Current Profile
C2 / Falcon
Out
In
Prior Profile
Merged Profile
CI
READYNOW PROFILE CACHE
20
Branches
Calls
OPENJDK READYNOW
<branch
target_bci='17'
cnt='5800'
taken='0'
not_taken='5800'
prob='never'/>
Branch compId methodId
17
5800
0
5800
<klass id='780' name=‘Square' …/>
<klass id='781' name=‘Sqrt’ …/>
<call method='783'
count='23161'
receiver='780' receiver_count=‘19901'
receiver2='781' receiver2_count=‘3260'
…/>
Class 780 Square
Class 781 Sqrt
Invoke compId methodId
23161
{ { 780 19901 }
{ 781 3260 } }
LOG COMPILATION PROFILE LOG
SIMILAR PROFILE DATA TO OPENJDK
21 https://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
Foo 7500
Bar 1500
Baz 1000
Quux 7500
Bar 1500
Foo 1000
Live
Call Histogram
Recorded
Call Histogram
Foo max(7500, 1000)
Bar max(1500, 1500)
Baz 1000
Merged
Call Histogram
Quux 7500
Prefer Live Data
over Recorded Data
Idempotent
MERGE PROFILES
22
612 24 % ! 3 …UninitializedForever::main @ 5 (25 bytes)
621 25 ! 3 …UninitializedForever::main (25 bytes)
952 26 % ! 4 …UninitializedForever::main @ 5 (25 bytes)
953 24 % ! 3 …UninitializedForever::main @ -2 (25 bytes) made not entrant
1024 26 % ! 4 …UninitializedForever::main @ -2 (25 bytes) made not entrant
1033 27 % ! 3 …UninitializedForever::main @ 5 (25 bytes)
1405 28 % ! 4 …UninitializedForever::main @ 5 (25 bytes)
…
7339 55 % ! 3 …UninitializedForever::main @ 5 (25 bytes)
7690 56 % ! 4 …UninitializedForever::main @ 5 (25 bytes)
7690 55 % ! 3 …UninitializedForever::main @ -2 (25 bytes) made not entrant
7761 56 % ! 4 …UninitializedForever::main @ -2 (25 bytes) made not entrant
7769 57 % ! 3 …UninitializedForever::main @ 5 (25 bytes)
AVOID COMPILE / DEOPT STORM
23 http://blog.joda.org/2011/08/printcompilation-jvm-flag.htmlhttps://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
-XX:+PrintCompilation
public class UninitializedForever {
static class Uninitialized {
static {
if ( true ) throw new RuntimeException();
}
}
public static void main(String[] args) {
for ( int i = 0; i < 100_000; ++i ) {
try {
new Uninitialized();
} catch ( Throwable t ) {
// ignore
}
}
}
}
24 http://blog.joda.org/2011/08/printcompilation-jvm-flag.htmlhttps://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
PRINTCOMPILATION OUTPUT
612 24 % ! 3 …UninitializedForever::main @ 5 (25 bytes)
621 25 ! 3 …UninitializedForever::main (25 bytes)
952 26 % ! 4 …UninitializedForever::main @ 5 (25 bytes)
953 24 % ! 3 …UninitializedForever::main @ -2 (25 bytes) made not entrant
1024 26 % ! 4 …UninitializedForever::main @ -2 (25 bytes) made not entrant
1033 27 % ! 3 …UninitializedForever::main @ 5 (25 bytes)
1405 28 % ! 4 …UninitializedForever::main @ 5 (25 bytes)
…
7339 55 % ! 3 …UninitializedForever::main @ 5 (25 bytes)
7690 56 % ! 4 …UninitializedForever::main @ 5 (25 bytes)
7690 55 % ! 3 …UninitializedForever::main @ -2 (25 bytes) made not entrant
7761 56 % ! 4 …UninitializedForever::main @ -2 (25 bytes) made not entrant
7769 57 % ! 3 …UninitializedForever::main @ 5 (25 bytes)
java -XX:+PrintCompilation UninitializedForever
25 http://blog.joda.org/2011/08/printcompilation-jvm-flag.htmlhttps://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
SIMPLE CONCEPT
NOT SO SIMPLE TO IMPLEMENT
26
NOT SO SIMPLE, THANKS TO
JAVA LANGUAGE
AND
JAVA ECOSYSTEM
27
JAVA IS A DYNAMIC LANGUAGE
Dynamically Loaded
Lazy Initialized
FROM MY PERSPECTIVE
Runtime Checked
Dynamically Dispatched
28 http://cr.openjdk.java.net/~twisti/slides/JVMLS%202015%20-%20Java%20Goes%20AOT.pdf
JIT DOESN’T KNOW
Fields
Methods
Parent Class
Interfaces
Anything
…
if ( always ) {
return Class1.getStatic();
} else {
return Class2.getStatic();
}
if ( always ) {
return Class1.getStatic();
} else {
uncommon_trap(:unloaded);
}
Give Up!
...
UNLOADED
29 https://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
Interpreter C1 C2 / Falcon
uncommon trap +
bail to interpreter
<uncommon_trap
thread='7171'
compile_id=’24'
compile_kind='osr'
compiler=‘C2'
level='4'
reason=‘uninitialized'
action=‘reinterpret'
stamp='1.038'>
…
</uncommon_trap>
LOG COMPILATION
BAIL TO INTERPRETER
30 https://wiki.openjdk.java.net/display/HotSpot/LogCompilation+overviewhttps://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
make
not entrant
new callers
Interpreter C1 C2 / Falcon
uncommon trap +
bail to interpreter
LOG COMPILATION
<make_not_entrant
thread='7171'
compile_id=’24'
compile_kind='osr'
compiler=‘C2'
level=‘4'
stamp=‘1.038' />
BAIL INTERPRETER + MAKE NOT ENTRANT
OpenJDK Zing
31 https://wiki.openjdk.java.net/display/HotSpot/LogCompilation+overviewhttps://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
Traps
163
STW Deopts
33
Not Entrant
213
Recompiled
84
Making a Hot Method Not Entrant
10-100ms Latency Event
DEOPT STATISTICS
32
INITIALIZE CLASS AT FIRST
Static Field Access
Static Method Call
New
Initialization of Child
...
LAZY INITIALIZED
33 http://cr.openjdk.java.net/~twisti/slides/JVMLS%202015%20-%20Java%20Goes%20AOT.pdf
MyClass.getStatic()
if ( !vm.is_init(MyClass)) {
vm.init(MyClass);
}
MyClass.getStatic()
Bloats size by 20%
Slows down by 10+%
http://joeduffyblog.com/2015/12/19/safe-native-code/
INITIALIZATION CHECKING
34
JIT RUNS LATE
MOST CLASSES ARE ALREADY INITIALIZED
MyClass.getStatic()
MyClass.getStatic()
vm.is_init(MyClass)
initialized
uncommon_trap(:uninitialized)
uninitialized
At compile time…
35 https://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
static final void hotMethod() {
if ( thing == null )
System.out.print("always");
else
System.out.print(“never");
}
static final void hotMethod() {
if ( thing == null )
System.out.print(“always");
else
uncommon_trap(:unstable_if);
}
trap + bail
Branch comp methodId
17
5800
0
5800
Branch comp methodId
17
5800
1
5800
1 update
untaken
branch
SPECULATION ALSO LEADS TO TRAPS
36 https://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
PICK LAST COMPILE / PROFILE
Reuse last profile
for each method
Last profile contains
any updates from
failed speculations
Produces stable
compilations
Compile
Foo::foo
Compile
Bar::bar
Recompile
Foo::foo
Profile Foo::foo @ time 1
Profile Bar::bar @ time 1
Profile Bar::bar @ time 2
Profile Foo::foo @ time 3
Profile Bar::bar @ time 3
37
REPLAYING COMPILATION LOG
WOULD JUST INSTALL TRAPS
38
TRACK CLASS LOADING
AND INITIALIZATION
39
MyClass.getStatic()
requires
MyClass init
Class 23 SomeClass
Class 80 MyClass
C2Compilation foo.Bar::baz
{ 23, 80 }
{ 23 }
loading prerequisites*
initialization prerequisites
* actually linking
COMPILATION PREREQUISITES
40
foo.Bar::baz
Loading
Initialization
SomeClass
MyClass
MyClass
Live
SomeClass
Recorded
SomeClass
notify
enqueue
Class Loading
C2 / Falcon Queue
notify
C2 / Falcon
41
NOT AOT / JIT
ASAP COMPILATION
42
AOT JIT CACHE READYNOW
Check Code is
Unchanged
Check Code is
Unchanged
Check Code is
Unchanged
Install
Initialization Guards
Wait for Initialization Wait for Initialization
No speculative
optimizations
Speculative optimizations
(if profile matches)
Speculative optimizations
(if profile matches)
...SOUNDS PROBLEMATIC, BUT CONSIDER
43
FALSE NOTIFICATIONS ARE OKAY
COMPILER MAINTAINS CORRECTNESS
MAY RESULT IN MORE TRAPS
44
45
Original With ReadyNow
5 mins
transactiontime/latency
Peak Perf
-0%
Traps
-60%
STW Deopts
-67%
Not Entrant
-75%
Recompiled
-67%
AT START-UP
COMPILATION
46
Eager Load
Classes
Eager Initialize
Most Classes
foo.Bar::baz
Loading
Initialization
SomeClass
MyClass
MyClass
Live
SomeClass
Recorded
SomeClass
eager load
notify
enqueue
C2 / Falcon Queue
notify
C2Resolve Constant
Pool Entries
...AT START-UP
47
48
5 mins
transactiontime/latency
Peak Perf
+2%
Traps
-49%
STW Deopts
-67%
Not Entrant
-72%
Recompiled
-55%
Original ReadyNow v1 Start-up Compilation
10
100
1000
0
count
49
5 mins
transactiontime/latency C1 C2 / Falcon C2 / Falcon Not Entrantstart main
Peak Perf
+2%
Traps
-49%
STW Deopts
-67%
Not Entrant
-72%
Recompiled
-55%
START REASONABLY FAST!
WARM-UP FAST!
STAY FAST!
50
PITFALLS!
ClassLoader.definePackage
Native Linking
Asserts
Enums
Initialization Order
51
ENUMS
enum MyEnum {
FOO,
BAR,
BAZ;
}
final enum MyEnum extends Enum<MyEnum> {
public static final FOO = new MyEnum(“FOO”, 0);
public static final BAR = new MyEnum(“BAR”, 1);
public static final BAZ = new MyEnum(“BAZ”, 2);
private static final MyEnum[] ENUM$VALUES = {
FOO, BAR, BAZ };
private MyEnum(String name, int ordinal) {
super(name, ordinal);
}
public static MyEnum[] values() {
return ENUM$VALUES;
}
}
…
52
ASSERTS
class Assert {
void foo(int x) {
assert(x > 0);
}
}
class Assert {
static final boolean $assertionsDisabled;
static {
$assertionsDisabled =
Assert.class.desiredAssertionStatus();
}
void foo(int x) {
if ( !$assertionsDisabled ) {
if ( !(x > 0) ) throw new AssertionError();
}
assert(x > 0);
}
}
53
BIG PITFALL #1
CLASS LOADERS
54
ClassLoader loader1 =
new URLClassLoader(new URL[] {
new File(“foo.jar”).toURL()
});
Class<?> fooClass1 =
loader1.loadClass(“Foo”);
ClassLoader loader2 =
new URLClassLoader(new URL[] {
new File(“foo.jar”).toURL()
});
Class<?> fooClass2 =
loader2.loadClass(“Foo”);
Indistinguishable After Persistence
CLASS LOADERS
“EVIL” TWINS
55
CLASS BUCKETS
notify
Foo, FP=7321
Foo v1 from ?
notify Foo, FP=4382
Foo v2 from ?
Foo v2 from ?
notify
notify?
Live Foo v1
loader?
Live Foo v2
loader?
56
FALSE NOTIFICATIONS ARE OKAY
COMPILER MAINTAINS CORRECTNESS
REMEMBER
57
ClassLoader loader1 =
new URLClassLoader(new URL[] {
new File(“foo.jar”).toURL()
});
Class<?> fooClass1 =
loader1.loadClass(“Foo”);
ClassLoader loader2 =
new URLClassLoader(new URL[] {
new File(“foo.jar”).toURL()
});
Class<?> fooClass2 =
loader1.loadClass(“Foo”);
Zing.identify(loader1, “loader1”); Zing.identify(loader2, “loader2”);
LOADER IDENTIFICATION API
58
DISAMBIGUATION
notify
Foo, FP=4382
Foo v2 from “loader1”
Foo v2 from “loader2”
notify
Live Foo v2
“loader2”
identify
59
JDK COMMON CONTAINERS
“KNOWN” LOADER AUTO-IDENTIFICATION
Bootstrap ClassLoader
Ext ClassLoader
System ClassLoader
OSGi
More to Come
60
UNKNOWN LOADER AUTO-IDENTIFICATION
notify
Foo, FP=7321
Foo v1 from ?
notify
Live Foo v1
loader?
identify loader
Loader identification triggers
eager load & initialization
61
BIG PITFALL #2
CLASS GENERATION
62
Generated classes cannot
be loaded immediately
Auto-recognize common code generators -
disable certain problematic behaviors
EAGER LOADING GENERATED CLASSES?
63
CLASS GENERATORS REFLECTION
Class<?> klass = obj.getClass();
Method method = klass.getMethod(“foo”, new Class<?>[] {});
for ( … ) {
method.invoke(obj);
}
:
[Loaded sun.reflect.GeneratedMethodAccessor1 from __JVM_DefineClass__]
[Loaded sun.reflect.GeneratedMethodAccessor2 from __JVM_DefineClass__]
[Loaded sun.reflect.GeneratedMethodAccessor999 from __JVM_DefineClass__]
…
java -XX:+TraceClassLoading
64
GeneratedMethodAccessor_RN80432DFE
GeneratedMethodAccessor_RN59AD0432
…
GeneratedMethodAccessor_RN432C809E
GeneratedMethodAccessor1
GeneratedMethodAccessor2
…
GeneratedMethodAccessor537 Big Improvement!
CLASS GENERATORS REFLECTION:
65
DOMSource source = new DOMSource(…);
TransformerFactory transFactory = TransformerFactory.newInstance();
for ( … ) {
Transformer transformer = transFactory.newTransformer(source);
…
}
CLASS GENERATORS XML TRANSFORM:
[Loaded transformName from __JVM_DefineClass__]
[Loaded transformName from __JVM_DefineClass__]
[Loaded transformName from __JVM_DefineClass__]
java -XX:+TraceClassLoading
66
int prod = Arrays.stream(ints).reduce(1, (r, el) -> r * el);
CLASS GENERATORS LAMBDAS:
[Loaded java.lang.invoke.LambdaForm$DMH/1534030866 from …LambdaForm]
[Loaded java.lang.invoke.LambdaForm$BMH/1927950199 from …LambdaForm]
[Loaded java.lang.invoke.LambdaForm$MH/321001045 from …LambdaForm]
java -XX:+TraceClassLoading
67 https://blog.takipi.com/the-dark-side-of-lambda-expressions-in-java-8/
CLASS MUTATORS HIBERNATE:
[Loaded pkg.MyDao$$EnhancerByCGLIB$$2aaa1f58 from ./my-daos.jar]
68
java -XX:+TraceClassLoading
MyDao CGLib
MyDao$$
EnhancerByCGLib$$
2aaa1f58
https://dzone.com/articles/cglib-proxies-and-hibernate-lazy-fetching
EVAL EVIL==CLASS GENERATION
XML Transform
AOP Rules Engines
ORMs: Hibernate
JSON Libraries
Reflection
Java 8 Lambdas Dynamic Proxies
Spring
Derby Spark v2
69
Live
SomeClass
Recorded
SomeClass
notify
Class Loading
notify
Recorded
SomeClass’
MATCHING
ENGINE
Code Generator Auto-Identification
ClassLoader Auto-Identification
ClassLoader Disambiguation
Fingerprint Matching
Structural Matching
Name Normalization
70
JDK / Library Upgrades
Small Code Changes
Resilient to Inlined Method Change
OTHER MATCHING ADDS RESILIENCY
71
Method Level Matching
FALCON
Azul’s New
LLVM-based JIT
72
DON’T WAIT FOR INITIALIZATION
foo.Bar::baz
Loading
Initialization
SomeClass
MyClass
MyClass
MyClass.getStatic()
if (!vm.is_init(MyClass)) {
vm.init(MyClass);
}
MyClass.getStatic()
Falcon Queue
73
Bloats size by 20+%
Slows down by 10+%Slows down by 10+%
Allows for Earlier
Stable Compilation
INLINE INITIALIZATION CHECKS
MyClass.getStatic()
if ( !vm.is_init(MyClass)) {
vm.init(MyClass);
}
MyClass.getStatic()
74
FOLLOW-UP COMPILATION
foo.Bar::baz
Loading
SomeClass
MyClass
foo.Bar::baz
Loading
Initialization
SomeClass
MyClass
MyClass
Quick Start Checklist Maximum Performance Checklist
Falcon Queue
75
76
5 mins
transactiontime/latency
Peak Perf
-7%
Traps
+40%
STW Deopts
-67%
Not Entrant
+169%
Recompiled
+456%
Original Start-up Compilation Quick Start + Init Checking
10
100
1000
0
count
77
5 mins
transactiontime/latency C1 C2 / Falcon C2 / Falcon Not Entrantstart main Peak Perf
-7%
Traps
+40%
STW Deopts
-67%
Not Entrant
+169%
Recompiled
+456%
KEEP ENTRANT + REPLACEMENT
new callers
Interpreter C1 C2 / Falcon
uncommon trap +
bail to interpreter
C2 / Falcon Queue
C2 / Falcon
Replacement
78
79
AND WITH ONE MORE ROUND OF PROFILING
Original Quick Start 2nd Gen ProfileQuick Start 1st Gen Profile
transactiontime/latency
5 mins
60-80% Peak Performance at Start-up
1.5ms - 150ms Initial Transactions
3rd Transaction Usually at Peak
-10 to +10% Impact on Peak Performance
RESULTS VARY
80
ReadyNow drives start-up —
hits JIT cache to minimize waiting
ReadyNow’s profile cache
backs up JIT cache
“EASY” TO ADD A JIT CACHE
FUTURE BENEFITS OF FALCON
81
JIT caches misses on
code change, code generators
Profile cache still hits on
unchanged methods
BEST OF BOTH WORLDS
ADDING A JIT CACHE
82
Conventional
Not an AOT
Not a JIT Cache Yet
“Natural” for OpenJDK
Matching Engine
Compilation Log
ASAP Compilation
Profile Cache
READYNOW ISN’T... READYNOW IS...
WHAT IS READYNOW?
83
84
REFERENCES
JVM Logging & Inspection Tools
PrintCompilation http://blog.joda.org/2011/08/printcompilation-jvm-flag.html
LogCompilation
By Stephen Colebourne
https://wiki.openjdk.java.net/display/HotSpot/LogCompilation+overview
From OpenJDK Wiki
https://github.com/AdoptOpenJDK/jitwatchJITWatch
Created by Chris Newland
85
REFERENCES
JVM Compilation & Speculative Optimization
Tiered Compilation
By Igor Veresov
https://www.slideshare.net/maddocig/tiered
Black Magic Method Dispatch
By Aleksey Shipilev
https://shipilev.net/blog/2015/black-magic-method-dispatch/
Safepoints in HotSpot JVM
By Alexey Ragozin
http://blog.ragozin.info/2012/10/safepoints-in-hotspot-jvm.html
https://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
5 Super Useful JIT Optimization Techniques
By Alex Zhinitsky
86
REFERENCES
Other Java AOTs
https://www.ibm.com/support/knowledgecenter/en/SSYKE2_7.1.0/com.ibm.java.aix.71.doc/diag/understanding/aot.html
IBM J9 AOT
https://www.excelsiorjet.com/tutorials/
Excelsior JET
Java 9 JAOTC
http://openjdk.java.net/jeps/295
http://cr.openjdk.java.net/~twisti/slides/JVMLS%202015%20-%20Java%20Goes%20AOT.pdf
Java Goes AOT By Christian Thalinger
THANK YOU
DOUGLAS Q. HAWKINS
LEAD JIT DEVELOPER
AZUL SYSTEMS
@dougqh
dhawkins@azul.com

More Related Content

What's hot

Modern c++ (C++ 11/14)
Modern c++ (C++ 11/14)Modern c++ (C++ 11/14)
Modern c++ (C++ 11/14)Geeks Anonymes
 
Architecture des ordinateurs : memoires
Architecture des ordinateurs : memoiresArchitecture des ordinateurs : memoires
Architecture des ordinateurs : memoiresAbdoulaye Dieng
 
FormationPython2019.pptx
FormationPython2019.pptxFormationPython2019.pptx
FormationPython2019.pptxLamissGhoul1
 
Trace kernel code tips
Trace kernel code tipsTrace kernel code tips
Trace kernel code tipsViller Hsiao
 
Tuning Android for low RAM
Tuning Android for low RAMTuning Android for low RAM
Tuning Android for low RAMChris Simmonds
 
한컴MDS_차량용 SW Timing 측정 솔루션_T1_Timing 1st Class
한컴MDS_차량용 SW Timing 측정 솔루션_T1_Timing 1st Class한컴MDS_차량용 SW Timing 측정 솔루션_T1_Timing 1st Class
한컴MDS_차량용 SW Timing 측정 솔루션_T1_Timing 1st ClassHANCOM MDS
 
Introduction to the LLVM Compiler System
Introduction to the LLVM  Compiler SystemIntroduction to the LLVM  Compiler System
Introduction to the LLVM Compiler Systemzionsaint
 
Chap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonChap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonMohammed TAMALI
 
How to write a TableGen backend
How to write a TableGen backendHow to write a TableGen backend
How to write a TableGen backendMin-Yih Hsu
 
Linux Interrupts
Linux InterruptsLinux Interrupts
Linux InterruptsKernel TLV
 
Coroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in PractiseCoroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in PractiseChristian Melchior
 
Cours : les listes chainées Prof. KHALIFA MANSOURI
Cours : les listes chainées  Prof. KHALIFA MANSOURI Cours : les listes chainées  Prof. KHALIFA MANSOURI
Cours : les listes chainées Prof. KHALIFA MANSOURI Mansouri Khalifa
 
Instruction Combine in LLVM
Instruction Combine in LLVMInstruction Combine in LLVM
Instruction Combine in LLVMWang Hsiangkai
 

What's hot (17)

Modern c++ (C++ 11/14)
Modern c++ (C++ 11/14)Modern c++ (C++ 11/14)
Modern c++ (C++ 11/14)
 
Architecture des ordinateurs : memoires
Architecture des ordinateurs : memoiresArchitecture des ordinateurs : memoires
Architecture des ordinateurs : memoires
 
FormationPython2019.pptx
FormationPython2019.pptxFormationPython2019.pptx
FormationPython2019.pptx
 
Trace kernel code tips
Trace kernel code tipsTrace kernel code tips
Trace kernel code tips
 
Tuning Android for low RAM
Tuning Android for low RAMTuning Android for low RAM
Tuning Android for low RAM
 
Sorbet at Grailed
Sorbet at GrailedSorbet at Grailed
Sorbet at Grailed
 
한컴MDS_차량용 SW Timing 측정 솔루션_T1_Timing 1st Class
한컴MDS_차량용 SW Timing 측정 솔루션_T1_Timing 1st Class한컴MDS_차량용 SW Timing 측정 솔루션_T1_Timing 1st Class
한컴MDS_차량용 SW Timing 측정 솔루션_T1_Timing 1st Class
 
Introduction to the LLVM Compiler System
Introduction to the LLVM  Compiler SystemIntroduction to the LLVM  Compiler System
Introduction to the LLVM Compiler System
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
 
Python.pptx
Python.pptxPython.pptx
Python.pptx
 
Chap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonChap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec python
 
How to write a TableGen backend
How to write a TableGen backendHow to write a TableGen backend
How to write a TableGen backend
 
Linux Interrupts
Linux InterruptsLinux Interrupts
Linux Interrupts
 
Coroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in PractiseCoroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in Practise
 
Cours : les listes chainées Prof. KHALIFA MANSOURI
Cours : les listes chainées  Prof. KHALIFA MANSOURI Cours : les listes chainées  Prof. KHALIFA MANSOURI
Cours : les listes chainées Prof. KHALIFA MANSOURI
 
The Spectre of Meltdowns
The Spectre of MeltdownsThe Spectre of Meltdowns
The Spectre of Meltdowns
 
Instruction Combine in LLVM
Instruction Combine in LLVMInstruction Combine in LLVM
Instruction Combine in LLVM
 

Similar to ReadyNow: Azul's Unconventional "AOT"

Reverse engineering Swisscom's Centro Grande Modem
Reverse engineering Swisscom's Centro Grande ModemReverse engineering Swisscom's Centro Grande Modem
Reverse engineering Swisscom's Centro Grande ModemCyber Security Alliance
 
Caffe studying 2017
Caffe studying 2017Caffe studying 2017
Caffe studying 2017Te-Yen Liu
 
OpenWorld Sep14 12c for_developers
OpenWorld Sep14 12c for_developersOpenWorld Sep14 12c for_developers
OpenWorld Sep14 12c for_developersConnor McDonald
 
ez-clang C++ REPL for bare-metal embedded devices
ez-clang C++ REPL for bare-metal embedded devicesez-clang C++ REPL for bare-metal embedded devices
ez-clang C++ REPL for bare-metal embedded devicesStefan Gränitz
 
Sangam 19 - PLSQL still the coolest
Sangam 19 - PLSQL still the coolestSangam 19 - PLSQL still the coolest
Sangam 19 - PLSQL still the coolestConnor McDonald
 
Global Interpreter Lock: Episode I - Break the Seal
Global Interpreter Lock: Episode I - Break the SealGlobal Interpreter Lock: Episode I - Break the Seal
Global Interpreter Lock: Episode I - Break the SealTzung-Bi Shih
 
Kubernetes Failure Stories, or: How to Crash Your Cluster - ContainerDays EU ...
Kubernetes Failure Stories, or: How to Crash Your Cluster - ContainerDays EU ...Kubernetes Failure Stories, or: How to Crash Your Cluster - ContainerDays EU ...
Kubernetes Failure Stories, or: How to Crash Your Cluster - ContainerDays EU ...Henning Jacobs
 
May2010 hex-core-opt
May2010 hex-core-optMay2010 hex-core-opt
May2010 hex-core-optJeff Larkin
 
Automated reduction of attack surface using call graph enumeration
Automated reduction of attack surface using call graph enumerationAutomated reduction of attack surface using call graph enumeration
Automated reduction of attack surface using call graph enumerationRuo Ando
 
Kubernetes Failure Stories - KubeCon Europe Barcelona
Kubernetes Failure Stories - KubeCon Europe BarcelonaKubernetes Failure Stories - KubeCon Europe Barcelona
Kubernetes Failure Stories - KubeCon Europe BarcelonaHenning Jacobs
 
Adding a BOLT pass
Adding a BOLT passAdding a BOLT pass
Adding a BOLT passAmir42407
 
Cray XT Porting, Scaling, and Optimization Best Practices
Cray XT Porting, Scaling, and Optimization Best PracticesCray XT Porting, Scaling, and Optimization Best Practices
Cray XT Porting, Scaling, and Optimization Best PracticesJeff Larkin
 
4 Node.js Gotchas: What your ops team needs to know
4 Node.js Gotchas: What your ops team needs to know4 Node.js Gotchas: What your ops team needs to know
4 Node.js Gotchas: What your ops team needs to knowDynatrace
 
SAP strikes back Your SAP server now counter attacks.
SAP strikes back Your SAP server now counter attacks.SAP strikes back Your SAP server now counter attacks.
SAP strikes back Your SAP server now counter attacks.Dmitry Iudin
 
Sprint 126
Sprint 126Sprint 126
Sprint 126ManageIQ
 
oracleeventshunting-190909105308.pdf
oracleeventshunting-190909105308.pdforacleeventshunting-190909105308.pdf
oracleeventshunting-190909105308.pdfssuser785ce21
 
UKOUG - 25 years of hints and tips
UKOUG - 25 years of hints and tipsUKOUG - 25 years of hints and tips
UKOUG - 25 years of hints and tipsConnor McDonald
 
Oracle events hunting [POUG19]
Oracle events hunting [POUG19]Oracle events hunting [POUG19]
Oracle events hunting [POUG19]Mahmoud Hatem
 
Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기Ji Hun Kim
 
리눅스 드라이버 실습 #3
리눅스 드라이버 실습 #3리눅스 드라이버 실습 #3
리눅스 드라이버 실습 #3Sangho Park
 

Similar to ReadyNow: Azul's Unconventional "AOT" (20)

Reverse engineering Swisscom's Centro Grande Modem
Reverse engineering Swisscom's Centro Grande ModemReverse engineering Swisscom's Centro Grande Modem
Reverse engineering Swisscom's Centro Grande Modem
 
Caffe studying 2017
Caffe studying 2017Caffe studying 2017
Caffe studying 2017
 
OpenWorld Sep14 12c for_developers
OpenWorld Sep14 12c for_developersOpenWorld Sep14 12c for_developers
OpenWorld Sep14 12c for_developers
 
ez-clang C++ REPL for bare-metal embedded devices
ez-clang C++ REPL for bare-metal embedded devicesez-clang C++ REPL for bare-metal embedded devices
ez-clang C++ REPL for bare-metal embedded devices
 
Sangam 19 - PLSQL still the coolest
Sangam 19 - PLSQL still the coolestSangam 19 - PLSQL still the coolest
Sangam 19 - PLSQL still the coolest
 
Global Interpreter Lock: Episode I - Break the Seal
Global Interpreter Lock: Episode I - Break the SealGlobal Interpreter Lock: Episode I - Break the Seal
Global Interpreter Lock: Episode I - Break the Seal
 
Kubernetes Failure Stories, or: How to Crash Your Cluster - ContainerDays EU ...
Kubernetes Failure Stories, or: How to Crash Your Cluster - ContainerDays EU ...Kubernetes Failure Stories, or: How to Crash Your Cluster - ContainerDays EU ...
Kubernetes Failure Stories, or: How to Crash Your Cluster - ContainerDays EU ...
 
May2010 hex-core-opt
May2010 hex-core-optMay2010 hex-core-opt
May2010 hex-core-opt
 
Automated reduction of attack surface using call graph enumeration
Automated reduction of attack surface using call graph enumerationAutomated reduction of attack surface using call graph enumeration
Automated reduction of attack surface using call graph enumeration
 
Kubernetes Failure Stories - KubeCon Europe Barcelona
Kubernetes Failure Stories - KubeCon Europe BarcelonaKubernetes Failure Stories - KubeCon Europe Barcelona
Kubernetes Failure Stories - KubeCon Europe Barcelona
 
Adding a BOLT pass
Adding a BOLT passAdding a BOLT pass
Adding a BOLT pass
 
Cray XT Porting, Scaling, and Optimization Best Practices
Cray XT Porting, Scaling, and Optimization Best PracticesCray XT Porting, Scaling, and Optimization Best Practices
Cray XT Porting, Scaling, and Optimization Best Practices
 
4 Node.js Gotchas: What your ops team needs to know
4 Node.js Gotchas: What your ops team needs to know4 Node.js Gotchas: What your ops team needs to know
4 Node.js Gotchas: What your ops team needs to know
 
SAP strikes back Your SAP server now counter attacks.
SAP strikes back Your SAP server now counter attacks.SAP strikes back Your SAP server now counter attacks.
SAP strikes back Your SAP server now counter attacks.
 
Sprint 126
Sprint 126Sprint 126
Sprint 126
 
oracleeventshunting-190909105308.pdf
oracleeventshunting-190909105308.pdforacleeventshunting-190909105308.pdf
oracleeventshunting-190909105308.pdf
 
UKOUG - 25 years of hints and tips
UKOUG - 25 years of hints and tipsUKOUG - 25 years of hints and tips
UKOUG - 25 years of hints and tips
 
Oracle events hunting [POUG19]
Oracle events hunting [POUG19]Oracle events hunting [POUG19]
Oracle events hunting [POUG19]
 
Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기
 
리눅스 드라이버 실습 #3
리눅스 드라이버 실습 #3리눅스 드라이버 실습 #3
리눅스 드라이버 실습 #3
 

More from Doug Hawkins

JVM Mechanics: Understanding the JIT's Tricks
JVM Mechanics: Understanding the JIT's TricksJVM Mechanics: Understanding the JIT's Tricks
JVM Mechanics: Understanding the JIT's TricksDoug Hawkins
 
Java Performance Puzzlers
Java Performance PuzzlersJava Performance Puzzlers
Java Performance PuzzlersDoug Hawkins
 
Concurrency Concepts in Java
Concurrency Concepts in JavaConcurrency Concepts in Java
Concurrency Concepts in JavaDoug Hawkins
 
JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?Doug Hawkins
 
Understanding Garbage Collection
Understanding Garbage CollectionUnderstanding Garbage Collection
Understanding Garbage CollectionDoug Hawkins
 
JVM Internals - NHJUG Jan 2012
JVM Internals - NHJUG Jan 2012JVM Internals - NHJUG Jan 2012
JVM Internals - NHJUG Jan 2012Doug Hawkins
 
Inside Android's Dalvik VM - NEJUG Nov 2011
Inside Android's Dalvik VM - NEJUG Nov 2011Inside Android's Dalvik VM - NEJUG Nov 2011
Inside Android's Dalvik VM - NEJUG Nov 2011Doug Hawkins
 
JVM Internals - NEJUG Nov 2010
JVM Internals - NEJUG Nov 2010JVM Internals - NEJUG Nov 2010
JVM Internals - NEJUG Nov 2010Doug Hawkins
 
Introduction to Class File Format & Byte Code
Introduction to Class File Format & Byte CodeIntroduction to Class File Format & Byte Code
Introduction to Class File Format & Byte CodeDoug Hawkins
 
JVM Internals - Garbage Collection & Runtime Optimizations
JVM Internals - Garbage Collection & Runtime OptimizationsJVM Internals - Garbage Collection & Runtime Optimizations
JVM Internals - Garbage Collection & Runtime OptimizationsDoug Hawkins
 

More from Doug Hawkins (11)

JVM Mechanics: Understanding the JIT's Tricks
JVM Mechanics: Understanding the JIT's TricksJVM Mechanics: Understanding the JIT's Tricks
JVM Mechanics: Understanding the JIT's Tricks
 
Java Performance Puzzlers
Java Performance PuzzlersJava Performance Puzzlers
Java Performance Puzzlers
 
JVM Mechanics
JVM MechanicsJVM Mechanics
JVM Mechanics
 
Concurrency Concepts in Java
Concurrency Concepts in JavaConcurrency Concepts in Java
Concurrency Concepts in Java
 
JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?
 
Understanding Garbage Collection
Understanding Garbage CollectionUnderstanding Garbage Collection
Understanding Garbage Collection
 
JVM Internals - NHJUG Jan 2012
JVM Internals - NHJUG Jan 2012JVM Internals - NHJUG Jan 2012
JVM Internals - NHJUG Jan 2012
 
Inside Android's Dalvik VM - NEJUG Nov 2011
Inside Android's Dalvik VM - NEJUG Nov 2011Inside Android's Dalvik VM - NEJUG Nov 2011
Inside Android's Dalvik VM - NEJUG Nov 2011
 
JVM Internals - NEJUG Nov 2010
JVM Internals - NEJUG Nov 2010JVM Internals - NEJUG Nov 2010
JVM Internals - NEJUG Nov 2010
 
Introduction to Class File Format & Byte Code
Introduction to Class File Format & Byte CodeIntroduction to Class File Format & Byte Code
Introduction to Class File Format & Byte Code
 
JVM Internals - Garbage Collection & Runtime Optimizations
JVM Internals - Garbage Collection & Runtime OptimizationsJVM Internals - Garbage Collection & Runtime Optimizations
JVM Internals - Garbage Collection & Runtime Optimizations
 

Recently uploaded

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 

Recently uploaded (20)

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 

ReadyNow: Azul's Unconventional "AOT"

  • 1. READYNOW DOUGLAS Q. HAWKINS LEAD JIT DEVELOPER AZUL SYSTEMS @dougqh dhawkins@azul.com AZUL’S UNCONVENTIONAL “AOT”
  • 2. ACKNOWLEDGEMENTS Compiler Team Runtime Team GC Team Perf Team QA Especially… Ivan Krylov Igor Laevsky Artur Pilipenko Roman Shirokiy Vladimir Voskeresensky 2
  • 3. ABOUT AZUL ZING Derived from HotSpot Known for C4 “Pauseless” GC Popular with Financial Customers R 3
  • 4. READYNOW’S ORIGINAL PURPOSE Originated from requests from our existing financial customers Eliminate Warm-up First transaction is critical No loss of peak performance Eliminate volatility No artificial load Expanding out into other user applications 4
  • 6. START WARMED-UP Just-in-Time is Slightly Too Late Need Something… Proactive Not Reactive0 400 800 1200 1600 warm-up 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ops/min XML validation benchmark 5 mins 6
  • 7. NO MINIMAL LOSS OF THROUGHPUT +30% 0 400 800 1200 1600 warm-up 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Speculative Optimizations Enabled Disabled ≅80Discarded Compilations * * out of 800 optimized tier compilations ops/min 5 mins 7
  • 8. non-sampling period sampling period full-speed period C2 C1Interpreter time C1 C2 additional sampling period stable period Trap + Bail to Interpreter 5x 10-100+x SIMPLIFIED CYCLE OF OPENJDK 8 https://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
  • 9. ACTUAL OPENJDK TIERING SYSTEM 0: Interpreter 1-3: C1 4: C2 1: No overhead 2: Counters 3: Counters + Profiling 0 0 0 3 3 31 2 4 4 Normal Flow Start-up Flow (C2 Busy) Trivial Method Flow 9 https://www.slideshare.net/maddocig/tiered
  • 10. ZING TIERING SYSTEM Interpreter C1 C2 / Falcon 0 3 4 OpenJDK Normal Flow Zing Flow Interpreter Baseline Optimized 10
  • 11. 5 mins transactiontime/latency Invidual XML validation results 10 100 1000 0 C1 C2 / Falcon C2 / Falcon Not Entrantcount 11
  • 14. ORIGINAL RUN SUBSEQUENT RUNS AT A *VERY HIGH* LEVEL 14
  • 15. MORE LIKE TRADITIONAL PROFILE GUIDED OPTIMIZATION hpp GCCCompile Execute & Profile cpp prof hpp Profile Guided Compile cpp GCCprof + instrumented exe instrumented exe optimized exe 15
  • 16. ... AOT JIT Cache READYNOW ISN’T... Compilation Log Profile Cache Add-on to existing compilers: C1 & C2 READYNOW IS 16
  • 17. COMPILATION LOG Interpreter C1 C2 / Falcon C1Compilation foo.Bar::baz C2Compilation foo.Bar::baz … 17
  • 18. Concatenative transaction log UPSERT-s into a database Grows with each compilation Plain text - uncompressed Backwards Compatible Accidentally similar to CI Replay 10-100 MiB on disk CONCATENATIVE TRANSACTION LOG 10-50 MiB from native memory 18
  • 19. Interpreter C1 Profile C2 / Falcon ZING PROFILING 19
  • 20. Interpreter C1 Current Profile C2 / Falcon Out In Prior Profile Merged Profile CI READYNOW PROFILE CACHE 20
  • 21. Branches Calls OPENJDK READYNOW <branch target_bci='17' cnt='5800' taken='0' not_taken='5800' prob='never'/> Branch compId methodId 17 5800 0 5800 <klass id='780' name=‘Square' …/> <klass id='781' name=‘Sqrt’ …/> <call method='783' count='23161' receiver='780' receiver_count=‘19901' receiver2='781' receiver2_count=‘3260' …/> Class 780 Square Class 781 Sqrt Invoke compId methodId 23161 { { 780 19901 } { 781 3260 } } LOG COMPILATION PROFILE LOG SIMILAR PROFILE DATA TO OPENJDK 21 https://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
  • 22. Foo 7500 Bar 1500 Baz 1000 Quux 7500 Bar 1500 Foo 1000 Live Call Histogram Recorded Call Histogram Foo max(7500, 1000) Bar max(1500, 1500) Baz 1000 Merged Call Histogram Quux 7500 Prefer Live Data over Recorded Data Idempotent MERGE PROFILES 22
  • 23. 612 24 % ! 3 …UninitializedForever::main @ 5 (25 bytes) 621 25 ! 3 …UninitializedForever::main (25 bytes) 952 26 % ! 4 …UninitializedForever::main @ 5 (25 bytes) 953 24 % ! 3 …UninitializedForever::main @ -2 (25 bytes) made not entrant 1024 26 % ! 4 …UninitializedForever::main @ -2 (25 bytes) made not entrant 1033 27 % ! 3 …UninitializedForever::main @ 5 (25 bytes) 1405 28 % ! 4 …UninitializedForever::main @ 5 (25 bytes) … 7339 55 % ! 3 …UninitializedForever::main @ 5 (25 bytes) 7690 56 % ! 4 …UninitializedForever::main @ 5 (25 bytes) 7690 55 % ! 3 …UninitializedForever::main @ -2 (25 bytes) made not entrant 7761 56 % ! 4 …UninitializedForever::main @ -2 (25 bytes) made not entrant 7769 57 % ! 3 …UninitializedForever::main @ 5 (25 bytes) AVOID COMPILE / DEOPT STORM 23 http://blog.joda.org/2011/08/printcompilation-jvm-flag.htmlhttps://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/ -XX:+PrintCompilation
  • 24. public class UninitializedForever { static class Uninitialized { static { if ( true ) throw new RuntimeException(); } } public static void main(String[] args) { for ( int i = 0; i < 100_000; ++i ) { try { new Uninitialized(); } catch ( Throwable t ) { // ignore } } } } 24 http://blog.joda.org/2011/08/printcompilation-jvm-flag.htmlhttps://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
  • 25. PRINTCOMPILATION OUTPUT 612 24 % ! 3 …UninitializedForever::main @ 5 (25 bytes) 621 25 ! 3 …UninitializedForever::main (25 bytes) 952 26 % ! 4 …UninitializedForever::main @ 5 (25 bytes) 953 24 % ! 3 …UninitializedForever::main @ -2 (25 bytes) made not entrant 1024 26 % ! 4 …UninitializedForever::main @ -2 (25 bytes) made not entrant 1033 27 % ! 3 …UninitializedForever::main @ 5 (25 bytes) 1405 28 % ! 4 …UninitializedForever::main @ 5 (25 bytes) … 7339 55 % ! 3 …UninitializedForever::main @ 5 (25 bytes) 7690 56 % ! 4 …UninitializedForever::main @ 5 (25 bytes) 7690 55 % ! 3 …UninitializedForever::main @ -2 (25 bytes) made not entrant 7761 56 % ! 4 …UninitializedForever::main @ -2 (25 bytes) made not entrant 7769 57 % ! 3 …UninitializedForever::main @ 5 (25 bytes) java -XX:+PrintCompilation UninitializedForever 25 http://blog.joda.org/2011/08/printcompilation-jvm-flag.htmlhttps://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
  • 26. SIMPLE CONCEPT NOT SO SIMPLE TO IMPLEMENT 26
  • 27. NOT SO SIMPLE, THANKS TO JAVA LANGUAGE AND JAVA ECOSYSTEM 27
  • 28. JAVA IS A DYNAMIC LANGUAGE Dynamically Loaded Lazy Initialized FROM MY PERSPECTIVE Runtime Checked Dynamically Dispatched 28 http://cr.openjdk.java.net/~twisti/slides/JVMLS%202015%20-%20Java%20Goes%20AOT.pdf
  • 29. JIT DOESN’T KNOW Fields Methods Parent Class Interfaces Anything … if ( always ) { return Class1.getStatic(); } else { return Class2.getStatic(); } if ( always ) { return Class1.getStatic(); } else { uncommon_trap(:unloaded); } Give Up! ... UNLOADED 29 https://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
  • 30. Interpreter C1 C2 / Falcon uncommon trap + bail to interpreter <uncommon_trap thread='7171' compile_id=’24' compile_kind='osr' compiler=‘C2' level='4' reason=‘uninitialized' action=‘reinterpret' stamp='1.038'> … </uncommon_trap> LOG COMPILATION BAIL TO INTERPRETER 30 https://wiki.openjdk.java.net/display/HotSpot/LogCompilation+overviewhttps://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
  • 31. make not entrant new callers Interpreter C1 C2 / Falcon uncommon trap + bail to interpreter LOG COMPILATION <make_not_entrant thread='7171' compile_id=’24' compile_kind='osr' compiler=‘C2' level=‘4' stamp=‘1.038' /> BAIL INTERPRETER + MAKE NOT ENTRANT OpenJDK Zing 31 https://wiki.openjdk.java.net/display/HotSpot/LogCompilation+overviewhttps://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
  • 32. Traps 163 STW Deopts 33 Not Entrant 213 Recompiled 84 Making a Hot Method Not Entrant 10-100ms Latency Event DEOPT STATISTICS 32
  • 33. INITIALIZE CLASS AT FIRST Static Field Access Static Method Call New Initialization of Child ... LAZY INITIALIZED 33 http://cr.openjdk.java.net/~twisti/slides/JVMLS%202015%20-%20Java%20Goes%20AOT.pdf
  • 34. MyClass.getStatic() if ( !vm.is_init(MyClass)) { vm.init(MyClass); } MyClass.getStatic() Bloats size by 20% Slows down by 10+% http://joeduffyblog.com/2015/12/19/safe-native-code/ INITIALIZATION CHECKING 34
  • 35. JIT RUNS LATE MOST CLASSES ARE ALREADY INITIALIZED MyClass.getStatic() MyClass.getStatic() vm.is_init(MyClass) initialized uncommon_trap(:uninitialized) uninitialized At compile time… 35 https://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
  • 36. static final void hotMethod() { if ( thing == null ) System.out.print("always"); else System.out.print(“never"); } static final void hotMethod() { if ( thing == null ) System.out.print(“always"); else uncommon_trap(:unstable_if); } trap + bail Branch comp methodId 17 5800 0 5800 Branch comp methodId 17 5800 1 5800 1 update untaken branch SPECULATION ALSO LEADS TO TRAPS 36 https://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
  • 37. PICK LAST COMPILE / PROFILE Reuse last profile for each method Last profile contains any updates from failed speculations Produces stable compilations Compile Foo::foo Compile Bar::bar Recompile Foo::foo Profile Foo::foo @ time 1 Profile Bar::bar @ time 1 Profile Bar::bar @ time 2 Profile Foo::foo @ time 3 Profile Bar::bar @ time 3 37
  • 38. REPLAYING COMPILATION LOG WOULD JUST INSTALL TRAPS 38
  • 39. TRACK CLASS LOADING AND INITIALIZATION 39
  • 40. MyClass.getStatic() requires MyClass init Class 23 SomeClass Class 80 MyClass C2Compilation foo.Bar::baz { 23, 80 } { 23 } loading prerequisites* initialization prerequisites * actually linking COMPILATION PREREQUISITES 40
  • 42. NOT AOT / JIT ASAP COMPILATION 42
  • 43. AOT JIT CACHE READYNOW Check Code is Unchanged Check Code is Unchanged Check Code is Unchanged Install Initialization Guards Wait for Initialization Wait for Initialization No speculative optimizations Speculative optimizations (if profile matches) Speculative optimizations (if profile matches) ...SOUNDS PROBLEMATIC, BUT CONSIDER 43
  • 44. FALSE NOTIFICATIONS ARE OKAY COMPILER MAINTAINS CORRECTNESS MAY RESULT IN MORE TRAPS 44
  • 45. 45 Original With ReadyNow 5 mins transactiontime/latency Peak Perf -0% Traps -60% STW Deopts -67% Not Entrant -75% Recompiled -67%
  • 47. Eager Load Classes Eager Initialize Most Classes foo.Bar::baz Loading Initialization SomeClass MyClass MyClass Live SomeClass Recorded SomeClass eager load notify enqueue C2 / Falcon Queue notify C2Resolve Constant Pool Entries ...AT START-UP 47
  • 48. 48 5 mins transactiontime/latency Peak Perf +2% Traps -49% STW Deopts -67% Not Entrant -72% Recompiled -55% Original ReadyNow v1 Start-up Compilation
  • 49. 10 100 1000 0 count 49 5 mins transactiontime/latency C1 C2 / Falcon C2 / Falcon Not Entrantstart main Peak Perf +2% Traps -49% STW Deopts -67% Not Entrant -72% Recompiled -55%
  • 50. START REASONABLY FAST! WARM-UP FAST! STAY FAST! 50
  • 52. ENUMS enum MyEnum { FOO, BAR, BAZ; } final enum MyEnum extends Enum<MyEnum> { public static final FOO = new MyEnum(“FOO”, 0); public static final BAR = new MyEnum(“BAR”, 1); public static final BAZ = new MyEnum(“BAZ”, 2); private static final MyEnum[] ENUM$VALUES = { FOO, BAR, BAZ }; private MyEnum(String name, int ordinal) { super(name, ordinal); } public static MyEnum[] values() { return ENUM$VALUES; } } … 52
  • 53. ASSERTS class Assert { void foo(int x) { assert(x > 0); } } class Assert { static final boolean $assertionsDisabled; static { $assertionsDisabled = Assert.class.desiredAssertionStatus(); } void foo(int x) { if ( !$assertionsDisabled ) { if ( !(x > 0) ) throw new AssertionError(); } assert(x > 0); } } 53
  • 54. BIG PITFALL #1 CLASS LOADERS 54
  • 55. ClassLoader loader1 = new URLClassLoader(new URL[] { new File(“foo.jar”).toURL() }); Class<?> fooClass1 = loader1.loadClass(“Foo”); ClassLoader loader2 = new URLClassLoader(new URL[] { new File(“foo.jar”).toURL() }); Class<?> fooClass2 = loader2.loadClass(“Foo”); Indistinguishable After Persistence CLASS LOADERS “EVIL” TWINS 55
  • 56. CLASS BUCKETS notify Foo, FP=7321 Foo v1 from ? notify Foo, FP=4382 Foo v2 from ? Foo v2 from ? notify notify? Live Foo v1 loader? Live Foo v2 loader? 56
  • 57. FALSE NOTIFICATIONS ARE OKAY COMPILER MAINTAINS CORRECTNESS REMEMBER 57
  • 58. ClassLoader loader1 = new URLClassLoader(new URL[] { new File(“foo.jar”).toURL() }); Class<?> fooClass1 = loader1.loadClass(“Foo”); ClassLoader loader2 = new URLClassLoader(new URL[] { new File(“foo.jar”).toURL() }); Class<?> fooClass2 = loader1.loadClass(“Foo”); Zing.identify(loader1, “loader1”); Zing.identify(loader2, “loader2”); LOADER IDENTIFICATION API 58
  • 59. DISAMBIGUATION notify Foo, FP=4382 Foo v2 from “loader1” Foo v2 from “loader2” notify Live Foo v2 “loader2” identify 59
  • 60. JDK COMMON CONTAINERS “KNOWN” LOADER AUTO-IDENTIFICATION Bootstrap ClassLoader Ext ClassLoader System ClassLoader OSGi More to Come 60
  • 61. UNKNOWN LOADER AUTO-IDENTIFICATION notify Foo, FP=7321 Foo v1 from ? notify Live Foo v1 loader? identify loader Loader identification triggers eager load & initialization 61
  • 62. BIG PITFALL #2 CLASS GENERATION 62
  • 63. Generated classes cannot be loaded immediately Auto-recognize common code generators - disable certain problematic behaviors EAGER LOADING GENERATED CLASSES? 63
  • 64. CLASS GENERATORS REFLECTION Class<?> klass = obj.getClass(); Method method = klass.getMethod(“foo”, new Class<?>[] {}); for ( … ) { method.invoke(obj); } : [Loaded sun.reflect.GeneratedMethodAccessor1 from __JVM_DefineClass__] [Loaded sun.reflect.GeneratedMethodAccessor2 from __JVM_DefineClass__] [Loaded sun.reflect.GeneratedMethodAccessor999 from __JVM_DefineClass__] … java -XX:+TraceClassLoading 64
  • 66. DOMSource source = new DOMSource(…); TransformerFactory transFactory = TransformerFactory.newInstance(); for ( … ) { Transformer transformer = transFactory.newTransformer(source); … } CLASS GENERATORS XML TRANSFORM: [Loaded transformName from __JVM_DefineClass__] [Loaded transformName from __JVM_DefineClass__] [Loaded transformName from __JVM_DefineClass__] java -XX:+TraceClassLoading 66
  • 67. int prod = Arrays.stream(ints).reduce(1, (r, el) -> r * el); CLASS GENERATORS LAMBDAS: [Loaded java.lang.invoke.LambdaForm$DMH/1534030866 from …LambdaForm] [Loaded java.lang.invoke.LambdaForm$BMH/1927950199 from …LambdaForm] [Loaded java.lang.invoke.LambdaForm$MH/321001045 from …LambdaForm] java -XX:+TraceClassLoading 67 https://blog.takipi.com/the-dark-side-of-lambda-expressions-in-java-8/
  • 68. CLASS MUTATORS HIBERNATE: [Loaded pkg.MyDao$$EnhancerByCGLIB$$2aaa1f58 from ./my-daos.jar] 68 java -XX:+TraceClassLoading MyDao CGLib MyDao$$ EnhancerByCGLib$$ 2aaa1f58 https://dzone.com/articles/cglib-proxies-and-hibernate-lazy-fetching
  • 69. EVAL EVIL==CLASS GENERATION XML Transform AOP Rules Engines ORMs: Hibernate JSON Libraries Reflection Java 8 Lambdas Dynamic Proxies Spring Derby Spark v2 69
  • 70. Live SomeClass Recorded SomeClass notify Class Loading notify Recorded SomeClass’ MATCHING ENGINE Code Generator Auto-Identification ClassLoader Auto-Identification ClassLoader Disambiguation Fingerprint Matching Structural Matching Name Normalization 70
  • 71. JDK / Library Upgrades Small Code Changes Resilient to Inlined Method Change OTHER MATCHING ADDS RESILIENCY 71 Method Level Matching
  • 73. DON’T WAIT FOR INITIALIZATION foo.Bar::baz Loading Initialization SomeClass MyClass MyClass MyClass.getStatic() if (!vm.is_init(MyClass)) { vm.init(MyClass); } MyClass.getStatic() Falcon Queue 73
  • 74. Bloats size by 20+% Slows down by 10+%Slows down by 10+% Allows for Earlier Stable Compilation INLINE INITIALIZATION CHECKS MyClass.getStatic() if ( !vm.is_init(MyClass)) { vm.init(MyClass); } MyClass.getStatic() 74
  • 76. 76 5 mins transactiontime/latency Peak Perf -7% Traps +40% STW Deopts -67% Not Entrant +169% Recompiled +456% Original Start-up Compilation Quick Start + Init Checking
  • 77. 10 100 1000 0 count 77 5 mins transactiontime/latency C1 C2 / Falcon C2 / Falcon Not Entrantstart main Peak Perf -7% Traps +40% STW Deopts -67% Not Entrant +169% Recompiled +456%
  • 78. KEEP ENTRANT + REPLACEMENT new callers Interpreter C1 C2 / Falcon uncommon trap + bail to interpreter C2 / Falcon Queue C2 / Falcon Replacement 78
  • 79. 79 AND WITH ONE MORE ROUND OF PROFILING Original Quick Start 2nd Gen ProfileQuick Start 1st Gen Profile transactiontime/latency 5 mins
  • 80. 60-80% Peak Performance at Start-up 1.5ms - 150ms Initial Transactions 3rd Transaction Usually at Peak -10 to +10% Impact on Peak Performance RESULTS VARY 80
  • 81. ReadyNow drives start-up — hits JIT cache to minimize waiting ReadyNow’s profile cache backs up JIT cache “EASY” TO ADD A JIT CACHE FUTURE BENEFITS OF FALCON 81
  • 82. JIT caches misses on code change, code generators Profile cache still hits on unchanged methods BEST OF BOTH WORLDS ADDING A JIT CACHE 82
  • 83. Conventional Not an AOT Not a JIT Cache Yet “Natural” for OpenJDK Matching Engine Compilation Log ASAP Compilation Profile Cache READYNOW ISN’T... READYNOW IS... WHAT IS READYNOW? 83
  • 84. 84 REFERENCES JVM Logging & Inspection Tools PrintCompilation http://blog.joda.org/2011/08/printcompilation-jvm-flag.html LogCompilation By Stephen Colebourne https://wiki.openjdk.java.net/display/HotSpot/LogCompilation+overview From OpenJDK Wiki https://github.com/AdoptOpenJDK/jitwatchJITWatch Created by Chris Newland
  • 85. 85 REFERENCES JVM Compilation & Speculative Optimization Tiered Compilation By Igor Veresov https://www.slideshare.net/maddocig/tiered Black Magic Method Dispatch By Aleksey Shipilev https://shipilev.net/blog/2015/black-magic-method-dispatch/ Safepoints in HotSpot JVM By Alexey Ragozin http://blog.ragozin.info/2012/10/safepoints-in-hotspot-jvm.html https://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/ 5 Super Useful JIT Optimization Techniques By Alex Zhinitsky
  • 86. 86 REFERENCES Other Java AOTs https://www.ibm.com/support/knowledgecenter/en/SSYKE2_7.1.0/com.ibm.java.aix.71.doc/diag/understanding/aot.html IBM J9 AOT https://www.excelsiorjet.com/tutorials/ Excelsior JET Java 9 JAOTC http://openjdk.java.net/jeps/295 http://cr.openjdk.java.net/~twisti/slides/JVMLS%202015%20-%20Java%20Goes%20AOT.pdf Java Goes AOT By Christian Thalinger
  • 87. THANK YOU DOUGLAS Q. HAWKINS LEAD JIT DEVELOPER AZUL SYSTEMS @dougqh dhawkins@azul.com