graal as a native jit in graalvm · • uses similar tricks to a snippet but is often simpler •...
TRANSCRIPT
![Page 1: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/1.jpg)
Tom Rodriguez GraalVM Compiler Team
Graal as a native JIT in GraalVM
![Page 2: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/2.jpg)
The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, timing, and pricing of any features or functionality described for Oracle’s products may change and remains at the sole discretion of Oracle Corporation.
GraalVM Native Image technology (including SubstrateVM) is early adopter technology. It is available only under an early adopter license and remains subject to potentially significant further changes, compatibility testing and certification.
Safe harbor statement
Copyright © 2020, Oracle and/or its affiliates2
![Page 3: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/3.jpg)
Native Image
3
![Page 4: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/4.jpg)
4
Drop-in replacement for Oracle Java 8 and Java 11 • Run your Java application faster
Ahead-of-time compilation for Java • Create standalone binaries with low footprint
High-performance JavaScript, Python, Ruby, R, ... • The first VM for true polyglot programming • Implement your own language or DSL
What is Graal VM?
![Page 5: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/5.jpg)
5
FREE on Oracle Cloud!
![Page 6: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/6.jpg)
6
GraalVM Open Source
Open Source LOC actively maintained by GraalVM team
Total: 3,640,000 lines of code
![Page 7: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/7.jpg)
7
Warmup effects of pure Java (jargraal) • Increased compilation with C1 • Increased heap allocation • Gradual warmup of Graal itself
Visible as normal Java code • Profile pollution • Java debugging and profiling tools
Complicates JDK Testing • -Xcomp, -Xbatch and -XX:-TieredCompilation
Why libgraal
![Page 8: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/8.jpg)
8
Graal compiled with native image as a shared library • It's actually libjvmcicompiler.so • Interacts with HotSpot more like C1 or C2
Default way of using Graal in GraalVM since 19.0 • Required JVMCI support in Labs JDK 8, 11 and 13+ • Can be loaded by JDK8, JDK11 and JDK13+
- Required JVMCI and Graal API and implementation changes https://medium.com/graalvm/libgraal-graalvm-compiler-as-a-precompiled-graalvm-native-image-26e354bee5c
What is libgraal
![Page 9: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/9.jpg)
Ahead-of-TimeCompilation
Application
Libraries
JDK
Substrate VM
Points-to Analysis
Run Initializations
Heap Snapshotting
Input: All classes from application,
libraries, and VM
Iterative analysis until fixed point is reached
Code in Text Section
Image Heap in Data SectionImage Heap
Writing
Output: Native executable or
shared library
9
Native Image processing
![Page 10: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/10.jpg)
10
Builds a standalone executable or library from a set of Java classes Closed World Assumption
• The points-to analysis needs to see all bytecode
- Removes unused classes, methods, and fields cannot be removed
- Compiles all reachable code • Dynamic parts of Java require configuration at build time
- Reflection, JNI, Proxy, resources, ... • No loading of new classes at run time
Native image
![Page 11: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/11.jpg)
11
Execution at run time starts with an initial heap: the “image heap” • Objects are allocated in the Java VM that runs the image generator • Heap snapshotting gathers all objects that are reachable at run time
Do things once at build time instead at every application startup • Class initializers, initializers for static and static final fields • Explicit code that is part of a so-called “Feature”
Examples for objects in the image heap • java.lang.Class objects, Enum constants
Native Image Heap
![Page 12: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/12.jpg)
12
Minimize differences between jargraal and libgraal paths • Easier to maintain/debug
Use existing native image machinery as much as possible • JNI • Encoded graphs
Rely on explicit logic instead of substitutions where possible • Improves maintainability
Allow both jargraal and libgraal JVMCI runtimes
Design goals of libgraal
![Page 13: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/13.jpg)
HotSpot Code CacheHotSpot Metaspace
HotSpot
13
ResolvedJavaMethod
ResolvedJavaType
java.lang.Class
Speculation
InstalledCode
SpeculationLog
InstanceKlass Method nmethod
MyUserObjectJavaConstant
Meta Access Context
Graal
Original JVMCI design
![Page 14: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/14.jpg)
14
Create a stronger distinction between compiler objects and runtime objects • Use JavaConstant instead of Object or subtypes in API • Encoding of SpeculationReason as JavaConstant • Eliminate exposed references to Class and other Objects
Compiler environment might not be the same as the execution environment • Use of Unsafe to get offsets instead of querying JVMCI directly • Use of Java reflection instead of JVMCI APIs
Integrated in JDK11 to ease later backporting • JDK-8205824
JVMCI API changes
![Page 15: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/15.jpg)
HotSpot Metaspace
InstanceKlass Method
MethodData
15
ResolvedJavaMethod
ResolvedJavaType
java.lang.Class
Speculation
InstalledCode
SpeculationLog
HotSpot Code Cache
nmethod
MyUserObject
JavaConstant
Graal
HotSpot Heap
JVMCI Handles
JavaConstant
JVMCI with jargraal
![Page 16: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/16.jpg)
HotSpot Metaspace
InstanceKlass Method
MethodData
16
ResolvedJavaMethod
ResolvedJavaType
java.lang.Class
Speculation
InstalledCode
SpeculationLog
HotSpot Code Cache
nmethod
MyUserObject
JavaConstant
Graal
HotSpot Heap Native Image Heap
JVMCI Handles
JavaConstant
JVMCI with libgraal
![Page 17: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/17.jpg)
17
HotSpot assumes JVMCI objects belong to its Java heap • C++ code must have indirect access to JVMCI objects
2 independent runtimes and GC • reduce coupling between JVMCI and HotSpot
Native image Java code can't interact directly with HotSpot objects • More JVMCI native methods
jdk.vm.ci.services.Services • IS_BUILDING_NATIVE_IMAGE/IS_IN_NATIVE_IMAGE
Caching of various service lookups Caching of Annotations required by the compiler
JVMCI implementation changes to support libgraal
![Page 18: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/18.jpg)
18
JVMCIEnv and JVMCIObject • Abstracts away to interact with JVMCI objects
- Creating constants • Use JNI under the covers to talk to libgraal
- Puts some restrictions on the HotSpot code
- Increased overhead Existing code translates and reads fairly naturally Looser coupling between HotSpot and JVMCI objects where necessary
• InstalledCode and method • Speculations become nmethod data
HotSpot C++ Changes
![Page 19: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/19.jpg)
19
HotSpot JVMCI Example before
C2V_VMENTRY(jobject, getConstantPool, (JNIEnv *, jobject, jobject object_handle)) constantPoolHandle cp; oop object = JNIHandles::resolve(object_handle); if (object == NULL) { THROW_0(vmSymbols::java_lang_NullPointerException()); } if (object->is_a(SystemDictionary::HotSpotResolvedJavaMethodImpl_klass())) { cp = CompilerToVM::asMethod(object)->constMethod()->constants(); } else if (object->is_a(SystemDictionary::HotSpotResolvedObjectTypeImpl_klass())) { cp = InstanceKlass::cast(CompilerToVM::asKlass(object))->constants(); } else { THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), err_msg("Unexpected type: %s", object->klass()->external_name())); } assert(!cp.is_null(), "npe"); JavaValue method_result(T_OBJECT); JavaCallArguments args; args.push_long((jlong) (address) cp()); JavaCalls::call_static(&method_result, SystemDictionary::HotSpotConstantPool_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::constantPool_fromMetaspace_signature(), &args, CHECK_NULL); return JNIHandles::make_local(THREAD, (oop)method_result.get_jobject());}
![Page 20: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/20.jpg)
20
HotSpot JVMCI Example after
C2V_VMENTRY_NULL(jobject, getConstantPool, (JNIEnv* env, jobject, jobject object_handle)) constantPoolHandle cp; JVMCIObject object = JVMCIENV->wrap(object_handle); if (object.is_null()) { JVMCI_THROW_NULL(NullPointerException); } if (JVMCIENV->isa_HotSpotResolvedJavaMethodImpl(object)) { cp = JVMCIENV->asMethod(object)->constMethod()->constants(); } else if (JVMCIENV->isa_HotSpotResolvedObjectTypeImpl(object)) { cp = InstanceKlass::cast(JVMCIENV->asKlass(object))->constants(); } else { JVMCI_THROW_MSG_NULL(IllegalArgumentException, err_msg("Unexpected type: %s", JVMCIENV->klass_name(object))); } assert(!cp.is_null(), "npe");
JVMCIObject result = JVMCIENV->get_jvmci_constant_pool(cp, JVMCI_CHECK_NULL); return JVMCIENV->get_jobject(result);}
![Page 21: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/21.jpg)
21
Uses serialized representation of parsed graphs • No bytecodes available • Faster than parsing
Fully initialized compiler stored in image heap Single JVMCI namespace
• Only Substrate types
Dynamic Graal compilation in native image binaries
![Page 22: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/22.jpg)
22
Hybrid JVMCI environment • BytecodeParser is used for Java code • encoded graphs used for snippets and method substitutions
- Refer to types that are actually part of libgraal Compiler must be initialized at start of isolate
• Connections between JVMCI and HotSpot must be built dynamically
Dynamic Graal compilation in libgraal
![Page 23: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/23.jpg)
23
Snippets are stylized pieces of Java code that implement low level features • Fast/slow allocation paths or identityHashCode for example
Parsed into a graph and then inlined to replace other nodes • @Fold is used to inject constant values from the environment
- Field offsets or mark word values for instance
- Boxes result into a JavaConstant • @NodeIntrinsic is used to insert a particular IR node
- Lets snippets perform low level operations
- Often takes the result of @Fold as an input
Snippets and method substitutions
![Page 24: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/24.jpg)
24
Snippet Example: fast identityHashCode
@Snippetstatic int identityHashCodeSnippet(Object x) { if (probability(NOT_FREQUENT_PROBABILITY, x == null)) { return 0; }
Word mark = loadWordFromObject(x, markOffset());
final Word biasedLock = mark.and( biasedLockMaskInPlace()); if (probability(FAST_PATH_PROBABILITY, biasedLock.equal(WordFactory.unsigned( unlockedMask())))) { int hash = (int) mark.unsignedShiftRight( identityHashCodeShift()).rawValue(); if (probability(FAST_PATH_PROBABILITY, hash != uninitializedIdentityHashCodeValue())) { return hash; } }
return identityHashCode(IDENTITY_HASHCODE, x);}
Node intrinsicNode intrinsic
Constant folding during snippet parsing
Machine-word sized value
The snippet is in class HashCodeSnippets
![Page 25: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/25.jpg)
25
Graph is parsed normally but all @Fold operations are deferred • NodeIntrinsic might be deferred as well
Graph is encoded and stored in the libgraal heap • The graph may contain constant references to HotSpot JVMCI types
- Converted to unresolved types during image building During dynamic compilation the snippet is decoded
• Fold and NodeIntrinsic are processed during decode • Symbolic type references are resolved against HotSpot
Snippet preparation and use in libgraal
![Page 26: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/26.jpg)
26
Like a snippet but inlined on the fly by the BytecodeParser • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates
More problematic for libgraal because it's not a graph • Alternate compilation mode for libgraal to encode the graph • Alternate BytecodeParser path to inline the decoded graph
More likely to reference random JDK types • May complicate decoding the graph
Method substitutions
![Page 27: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/27.jpg)
27
Method substitution example: SHA crypt
@MethodSubstitution(isStatic = false) static void implCompress0(Object receiver, byte[] buf, int ofs) { Object realReceiver = PiNode.piCastNonNull(receiver, HotSpotReplacementsUtil.methodHolderClass(INJECTED_INTRINSIC_CONTEXT)); Object state = RawLoadNode.load(realReceiver, stateOffset(INJECTED_INTRINSIC_CONTEXT), JavaKind.Object, LocationIdentity.any()); Word bufAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(buf, ReplacementsUtil.getArrayBaseOffset(INJECTED_METAACCESS, JavaKind.Byte) + ofs)); Word stateAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(state, ReplacementsUtil.getArrayBaseOffset(INJECTED_METAACCESS, JavaKind.Int))); HotSpotBackend.sha5ImplCompressStub(bufAddr, stateAddr); }
@Fold static long stateOffset(@InjectedParameter IntrinsicContext context) { return HotSpotReplacementsUtil.getFieldOffset(HotSpotReplacementsUtil.methodHolderClass(context), "state"); }
Injected HotSpot JVMCI typeAvoid use of Unsafe
Machine-word sized value
![Page 28: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/28.jpg)
28
Total compile time for DaCapo lusearch
0
10
20
30
40
C1 C2/Graal
C2 jargraal CE libgraal CE jargraal EE libgraal EE
![Page 29: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/29.jpg)
29
Native image GC is slower than HotSpot GC • For most compiles it’s not an issue • Very large graphs • Serializes multiple compilation threads
Increased JNI overhead from JNI • Mainly affects the final code installation step
Native image compiled Graal may be slower than fully warmed up jargraal • Mitigated in GraalVM EE with PGO and compressed oops
Large shared library
Tradeoffs
![Page 30: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/30.jpg)
30
Truffle runtime can use libgraal to compile Truffle methods • Truffle runtime must always run as normal Java code • libgraal exports a Truffle compilation entry point
- Appears as a normal Java native method
- See substratevm/ImplementingNativeMethodsInJavaWithSVM.md • Invoked by passing JVMCI objects from jargraal to libgraal
- All compilation is performed by libgraal • Faster start up time
Truffle partial evaluation using libgraal
![Page 31: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/31.jpg)
31
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 490
2000
4000
6000
8000
10000
12000
Octane Box2d
Graal on HotSpot LibGraal SubstrateVM
Iteration
Tim
e(m
s)
Time of each iteration running Octane Box2d Times are average values of 10 executions 100 iterations time reduced from 58,58s to 35,83s
JarGraal LibGraal Native Image
![Page 32: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/32.jpg)
32
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 490
1000
2000
3000
4000
5000
6000
7000
Octane Crypto
Graal on HotSpot LibGraal SubstrateVM
Iteration
Tim
e(m
s)
Time of each iteration running Octane Crypto Times are average values of 10 executions 100 iterations time reduced from 18,39s to 10,17s
JarGraal LibGraal Native Image
![Page 33: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/33.jpg)
33
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 200
5000
10000
15000
20000
25000
30000
35000
Octane Mandreel
Graal On HotSpot LibGraal SubstrateVM
Iteration
Tim
e(m
s)
Time of each iteration running Octane Mandreel Times are average values of 10 executions 100 iterations time reduced from 47,60s to 41.6s
JarGraal LibGraal Native Image
![Page 34: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/34.jpg)
34
Investigating multiple isolates • Complicates monitoring and output
Completely isolate libgraal types from HotSpot runtime • libgraal becomes completely standalone
GC tuning Reduce library size
• Make some Graal options statically disabled
Future work
![Page 35: Graal as a native JIT in GraalVM · • Uses similar tricks to a Snippet but is often simpler • Has to be careful about FrameStates More problematic for libgraal because it's not](https://reader034.vdocuments.us/reader034/viewer/2022042414/5f2e2d9a102a691cf9446e2b/html5/thumbnails/35.jpg)