Overview
Graal Compiler as a Service (CaaS) provides programmatic access to the Graal compiler, allowing dynamic compilation, optimization, and code generation at runtime. This enables advanced use cases like dynamic language implementation, JIT compilation for custom DSLs, and runtime code optimization.
Key Components
- Graal SDK: Core APIs for compiler access
- Truffle API: Language implementation framework
- Polyglot API: Multi-language execution
- JVMCI: Java Virtual Machine Compiler Interface
Basic Setup and Dependencies
1. Maven Dependencies
<properties> <graalvm.version>22.3.0</graalvm.version> </properties> <dependencies> <!-- Graal SDK --> <dependency> <groupId>org.graalvm.sdk</groupId> <artifactId>graal-sdk</artifactId> <version>${graalvm.version}</version> </dependency> <!-- Compiler API --> <dependency> <groupId>org.graalvm.compiler</groupId> <artifactId>compiler</artifactId> <version>${graalvm.version}</version> </dependency> <!-- Truffle API --> <dependency> <groupId>org.graalvm.truffle</groupId> <artifactId>truffle-api</artifactId> <version>${graalvm.version}</version> </dependency> <!-- Polyglot API --> <dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>polyglot</artifactId> <version>${graalvm.version}</version> </dependency> </dependencies> 2. JVM Arguments
# Enable JVMCI compiler -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:+UseJVMCICompiler # Set Graal as the JIT compiler -XX:+UseJVMCINativeLibrary # For AOT compilation -XX:+UseAOT -XX:AOTLibrary=./generated.aot # Compiler diagnostics -XX:+PrintCompilation -XX:+PrintInlining -XX:+PrintAssembly
Core Compiler Service APIs
1. Basic Compiler Access
import org.graalvm.compiler.api.runtime.GraalJVMCICompiler; import org.graalvm.compiler.core.target.Backend; import org.graalvm.compiler.hotspot.HotSpotGraalCompiler; import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider; import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration; import org.graalvm.compiler.phases.PhaseSuite; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.phases.util.Providers; import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.runtime.JVMCI; public class BasicCompilerService { public static void accessGraalCompiler() { try { // Get JVMCI runtime JVMCI.initialize(); // Access Graal compiler instance GraalJVMCICompiler compiler = (GraalJVMCICompiler) JVMCI.getCompiler(); if (compiler instanceof HotSpotGraalCompiler) { HotSpotGraalCompiler graalCompiler = (HotSpotGraalCompiler) compiler; HotSpotGraalRuntimeProvider runtime = graalCompiler.getGraalRuntime(); System.out.println("Graal Compiler Version: " + runtime.getCompilerConfigurationName()); System.out.println("Backend: " + runtime.getHostBackend()); } } catch (Exception e) { System.err.println("Failed to access Graal compiler: " + e.getMessage()); } } public static void listAvailableOptimizations() { try { HotSpotGraalCompiler compiler = getGraalCompiler(); if (compiler != null) { Providers providers = compiler.getGraalRuntime().getHostBackend().getProviders(); PhaseSuite<HighTierContext> highTier = compiler.getGraalRuntime() .getSuites().getDefaultSuites().getDefaultGraphBuilderSuite(); System.out.println("Available high-tier optimizations:"); highTier.getPhases().forEach(phase -> System.out.println(" - " + phase.getClass().getSimpleName())); } } catch (Exception e) { e.printStackTrace(); } } private static HotSpotGraalCompiler getGraalCompiler() { try { JVMCI.initialize(); GraalJVMCICompiler compiler = (GraalJVMCICompiler) JVMCI.getCompiler(); return (HotSpotGraalCompiler) compiler; } catch (Exception e) { return null; } } } 2. Dynamic Method Compilation
import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.code.InstalledCode; import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime; import java.lang.reflect.Method; public class DynamicCompilationService { private final HotSpotGraalCompiler compiler; private final HotSpotJVMCIRuntime jvmciRuntime; public DynamicCompilationService() { JVMCI.initialize(); this.compiler = (HotSpotGraalCompiler) JVMCI.getCompiler(); this.jvmciRuntime = HotSpotJVMCIRuntime.runtime(); } public InstalledCode compileMethod(Method method) { try { // Resolve Java method to JVMCI representation ResolvedJavaMethod resolvedMethod = jvmciRuntime.getResolvedJavaMethod(method); // Compile the method return compiler.compileMethod(resolvedMethod); } catch (Exception e) { throw new RuntimeException("Failed to compile method: " + method.getName(), e); } } public void forceCompilation(Method method) { try { InstalledCode compiledCode = compileMethod(method); if (compiledCode != null) { System.out.println("Successfully compiled: " + method.getName()); System.out.println("Code address: " + compiledCode.getStart()); System.out.println("Code size: " + compiledCode.getSize()); } } catch (Exception e) { System.err.println("Compilation failed for: " + method.getName()); } } // Example method to compile public static class ComputeIntensive { public static long fibonacci(int n) { if (n <= 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); } public static double calculatePi(int iterations) { double pi = 0.0; for (int i = 0; i < iterations; i++) { pi += Math.pow(-1, i) / (2 * i + 1); } return 4 * pi; } } public static void demonstrateCompilation() throws Exception { DynamicCompilationService service = new DynamicCompilationService(); // Force compilation of compute-intensive methods Method fibMethod = ComputeIntensive.class.getMethod("fibonacci", int.class); Method piMethod = ComputeIntensive.class.getMethod("calculatePi", int.class); service.forceCompilation(fibMethod); service.forceCompilation(piMethod); // Now execute the compiled methods long startTime = System.nanoTime(); long result = ComputeIntensive.fibonacci(35); long duration = System.nanoTime() - startTime; System.out.printf("Fibonacci(35) = %d (took %d ns)%n", result, duration); } } Advanced Compilation Scenarios
1. Custom Compilation Pipeline
import org.graalvm.compiler.code.CompilationResult; import org.graalvm.compiler.core.common.CompilationIdentifier; import org.graalvm.compiler.core.target.Backend; import org.graalvm.compiler.java.GraphBuilderPhase; import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration; import org.graalvm.compiler.options.OptionValues; import org.graalvm.compiler.phases.OptimisticOptimizations; import org.graalvm.compiler.phases.PhaseSuite; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.phases.tiers.Suites; import jdk.vm.ci.code.CodeCacheProvider; import jdk.vm.ci.meta.ResolvedJavaMethod; public class CustomCompilationPipeline { private final HotSpotGraalCompiler compiler; private final Backend backend; private final Providers providers; public CustomCompilationPipeline() { JVMCI.initialize(); this.compiler = (HotSpotGraalCompiler) JVMCI.getCompiler(); this.backend = compiler.getGraalRuntime().getHostBackend(); this.providers = backend.getProviders(); } public CompilationResult compileWithCustomPipeline(ResolvedJavaMethod method, PhaseSuite<HighTierContext> customSuites) { try { // Create compilation identifier CompilationIdentifier compilationId = backend.getCompilationIdentifier(method); // Build graph StructuredGraph graph = new StructuredGraph.Builder( new OptionValues(), new DebugContext() ).compilationId(compilationId).build(); // Graph building phase GraphBuilderConfiguration graphBuilderConfig = GraphBuilderConfiguration.getDefault(); GraphBuilderPhase.Instance graphBuilder = new GraphBuilderPhase.Instance( providers.getMetaAccess(), providers.getStampProvider(), providers.getConstantReflection(), providers.getConstantFieldProvider(), graphBuilderConfig, OptimisticOptimizations.ALL, null ); graphBuilder.apply(graph); // Apply custom optimization suites HighTierContext highTierContext = new HighTierContext( providers, customSuites, OptimisticOptimizations.ALL ); customSuites.apply(graph, highTierContext); // Lower to machine code return backend.compile(graph, null, null); } catch (Exception e) { throw new RuntimeException("Custom compilation failed", e); } } public static class DebugContext extends org.graalvm.compiler.debug.DebugContext { // Simplified debug context implementation public DebugContext() { super(null, null, null, null, null, null, null, null); } } } 2. Runtime Code Generation and Compilation
import org.graalvm.compiler.api.replacements.SnippetReflectionProvider; import org.graalvm.compiler.hotspot.meta.HotSpotProviders; import org.graalvm.compiler.replacements.SnippetTemplate; import java.lang.reflect.Constructor; import java.util.HashMap; import java.util.Map; public class RuntimeCodeGenerator { private final HotSpotGraalCompiler compiler; private final HotSpotProviders providers; private final Map<String, InstalledCode> compiledSnippets = new HashMap<>(); public RuntimeCodeGenerator() { JVMCI.initialize(); this.compiler = (HotSpotGraalCompiler) JVMCI.getCompiler(); this.providers = (HotSpotProviders) compiler.getGraalRuntime().getHostBackend().getProviders(); } public static class DynamicSnippet { private final String name; private final String source; private final Class<?>[] parameterTypes; public DynamicSnippet(String name, String source, Class<?>... parameterTypes) { this.name = name; this.source = source; this.parameterTypes = parameterTypes; } // Getters public String getName() { return name; } public String getSource() { return source; } public Class<?>[] getParameterTypes() { return parameterTypes; } } public InstalledCode compileSnippet(DynamicSnippet snippet) { try { // In a real implementation, you would parse the source and generate bytecode // For demonstration, we'll use reflection to create a synthetic method Class<?> generatedClass = generateSyntheticClass(snippet); Method snippetMethod = generatedClass.getMethod("execute", snippet.getParameterTypes()); ResolvedJavaMethod resolvedMethod = providers.getMetaAccess() .lookupJavaMethod(snippetMethod); InstalledCode installedCode = compiler.compileMethod(resolvedMethod); compiledSnippets.put(snippet.getName(), installedCode); return installedCode; } catch (Exception e) { throw new RuntimeException("Failed to compile snippet: " + snippet.getName(), e); } } public Object executeSnippet(String snippetName, Object... args) { try { InstalledCode code = compiledSnippets.get(snippetName); if (code == null) { throw new IllegalArgumentException("Snippet not found: " + snippetName); } return code.executeVarargs(args); } catch (Exception e) { throw new RuntimeException("Failed to execute snippet: " + snippetName, e); } } private Class<?> generateSyntheticClass(DynamicSnippet snippet) throws Exception { // Simplified synthetic class generation // In practice, you would use ASM or similar bytecode engineering library String className = "DynamicSnippet_" + System.currentTimeMillis(); // This is a simplified example - real implementation would generate actual bytecode return SyntheticClassGenerator.generateClass(className, snippet); } // Example usage public static void demonstrateRuntimeCompilation() throws Exception { RuntimeCodeGenerator generator = new RuntimeCodeGenerator(); // Define a dynamic snippet (simplified) DynamicSnippet multiplySnippet = new DynamicSnippet( "multiply", "public static int execute(int a, int b) { return a * b; }", int.class, int.class ); // Compile the snippet generator.compileSnippet(multiplySnippet); // Execute the compiled snippet Object result = generator.executeSnippet("multiply", 7, 6); System.out.println("7 * 6 = " + result); } // Placeholder for synthetic class generation public static class SyntheticClassGenerator { public static Class<?> generateClass(String className, DynamicSnippet snippet) throws Exception { // In practice, use ASM, Javassist, or similar // For this example, we'll return a simple pre-defined class return PredefinedSnippet.class; } } // Predefined class for demonstration public static class PredefinedSnippet { public static int execute(int a, int b) { return a * b; } } } Polyglot Compilation Services
1. Multi-Language Execution
import org.graalvm.polyglot.Context; import org.graalvm.polyglot.Engine; import org.graalvm.polyglot.Source; import org.graalvm.polyglot.Value; public class PolyglotCompilationService { private final Engine engine; public PolyglotCompilationService() { this.engine = Engine.newBuilder() .option("engine.Compilation", "true") // Enable JIT compilation .option("engine.BackgroundCompilation", "true") // Background compilation .option("engine.CompileImmediately", "true") // Compile immediately .build(); } public Object executeJavaScript(String code) { try (Context context = Context.newBuilder("js") .engine(engine) .build()) { Source source = Source.newBuilder("js", code, "script.js").build(); Value result = context.eval(source); return result.as(Object.class); } catch (Exception e) { throw new RuntimeException("JavaScript execution failed", e); } } public Object executePython(String code) { try (Context context = Context.newBuilder("python") .engine(engine) .build()) { Source source = Source.newBuilder("python", code, "script.py").build(); Value result = context.eval(source); return result.as(Object.class); } catch (Exception e) { throw new RuntimeException("Python execution failed", e); } } public void optimizeLanguageCode(String language, String code, int iterations) { try (Context context = Context.newBuilder(language) .engine(engine) .option("engine.CompileImmediately", "true") .option("engine.TraceCompilation", "true") .build()) { Source source = Source.newBuilder(language, code, "optimized." + language).build(); // Warm up for JIT compilation for (int i = 0; i < iterations; i++) { context.eval(source); } // Measure optimized performance long startTime = System.nanoTime(); Value result = context.eval(source); long duration = System.nanoTime() - startTime; System.out.printf("%s execution took %d ns after %d iterations%n", language, duration, iterations); System.out.println("Result: " + result.asString()); } catch (Exception e) { throw new RuntimeException("Optimization failed for " + language, e); } } public static void demonstratePolyglot() { PolyglotCompilationService service = new PolyglotCompilationService(); // JavaScript example String jsCode = """ function factorial(n) { if (n <= 1) return 1; return n * factorial(n - 1); } factorial(20); """; // Python example String pythonCode = """ def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) fibonacci(30) """; System.out.println("JavaScript result: " + service.executeJavaScript(jsCode)); System.out.println("Python result: " + service.executePython(pythonCode)); // Optimize and measure service.optimizeLanguageCode("js", jsCode, 1000); service.optimizeLanguageCode("python", pythonCode, 1000); } } 2. Custom Language Implementation with Graal
import com.oracle.truffle.api.CallTarget; import com.oracle.truffle.api.Truffle; import com.oracle.truffle.api.TruffleLanguage; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.RootNode; @TruffleLanguage.Registration( id = "simplecalc", name = "Simple Calculator", version = "1.0", characterMimeTypes = "application/x-simplecalc" ) public class SimpleCalcLanguage extends TruffleLanguage<SimpleCalcContext> { @Override protected SimpleCalcContext createContext(Env env) { return new SimpleCalcContext(); } @Override protected CallTarget parse(ParsingRequest request) throws Exception { String sourceCode = request.getSource().getCharacters().toString(); ExpressionNode expression = parseExpression(sourceCode); RootNode rootNode = new SimpleCalcRootNode(this, expression); return Truffle.getRuntime().createCallTarget(rootNode); } private ExpressionNode parseExpression(String source) { // Simplified parser - in practice, use a proper parser generator if (source.contains("+")) { String[] parts = source.split("\\+"); return new AddNode( parseExpression(parts[0].trim()), parseExpression(parts[1].trim()) ); } else { return new LiteralNode(Integer.parseInt(source.trim())); } } public static class SimpleCalcContext { // Language context } public static class SimpleCalcRootNode extends RootNode { @Child private ExpressionNode expression; public SimpleCalcRootNode(SimpleCalcLanguage language, ExpressionNode expression) { super(language); this.expression = expression; } @Override public Object execute(VirtualFrame frame) { return expression.execute(frame); } } public abstract static class ExpressionNode extends Node { public abstract Object execute(VirtualFrame frame); } public static class LiteralNode extends ExpressionNode { private final int value; public LiteralNode(int value) { this.value = value; } @Override public Object execute(VirtualFrame frame) { return value; } } public static class AddNode extends ExpressionNode { @Child private ExpressionNode left; @Child private ExpressionNode right; public AddNode(ExpressionNode left, ExpressionNode right) { this.left = left; this.right = right; } @Override public Object execute(VirtualFrame frame) { int leftVal = (int) left.execute(frame); int rightVal = (int) right.execute(frame); return leftVal + rightVal; } } } public class CustomLanguageRunner { public static void runCustomLanguage() { try (Context context = Context.newBuilder("simplecalc").build()) { Source source = Source.newBuilder("simplecalc", "10 + 20", "test.calc").build(); Value result = context.eval(source); System.out.println("Custom language result: " + result.asInt()); } } } Performance Monitoring and Optimization
1. Compilation Statistics and Monitoring
import org.graalvm.compiler.debug.DebugContext; import org.graalvm.compiler.debug.TTY; import org.graalvm.compiler.serviceprovider.GraalServices; import java.lang.management.CompilationMXBean; import java.lang.management.ManagementFactory; import java.util.concurrent.atomic.AtomicLong; public class CompilationMonitor { private final AtomicLong compilationCount = new AtomicLong(); private final AtomicLong compilationTime = new AtomicLong(); private final CompilationMXBean compilationBean; public CompilationMonitor() { this.compilationBean = ManagementFactory.getCompilationMXBean(); } public void startMonitoring() { // Enable Graal compiler diagnostics System.setProperty("graal.PrintCompilation", "true"); System.setProperty("graal.TraceInlining", "true"); System.setProperty("graal.Dump", ":3"); Thread monitorThread = new Thread(this::monitorCompilations, "CompilationMonitor"); monitorThread.setDaemon(true); monitorThread.start(); } private void monitorCompilations() { while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(5000); // Check every 5 seconds printCompilationStats(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } } } private void printCompilationStats() { if (compilationBean.isCompilationTimeMonitoringSupported()) { long totalCompilationTime = compilationBean.getTotalCompilationTime(); long currentCount = compilationCount.get(); System.out.printf("Compilation Statistics:%n"); System.out.printf(" Total compilation time: %d ms%n", totalCompilationTime); System.out.printf(" Compiled methods: %d%n", currentCount); System.out.printf(" Average time per method: %.2f ms%n", currentCount > 0 ? (double) totalCompilationTime / currentCount : 0); // Graal-specific statistics printGraalSpecificStats(); } } private void printGraalSpecificStats() { try { // Access Graal-specific compilation metrics // This would require internal Graal APIs in a real implementation System.out.println(" Graal compiler: Active"); } catch (Exception e) { System.out.println(" Graal compiler: Information unavailable"); } } public static class OptimizedCodeExecutor { private final CompilationMonitor monitor; public OptimizedCodeExecutor(CompilationMonitor monitor) { this.monitor = monitor; } public long executeWithProfiling(Runnable task, String taskName) { // Warm up for (int i = 0; i < 1000; i++) { task.run(); } // Force compilation System.gc(); // Measure optimized performance long startTime = System.nanoTime(); for (int i = 0; i < 10000; i++) { task.run(); } long duration = System.nanoTime() - startTime; System.out.printf("Task '%s' executed in %d ns%n", taskName, duration / 10000); return duration; } } } 2. AOT (Ahead-of-Time) Compilation Service
import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.hosted.Feature; import org.graalvm.nativeimage.hosted.RuntimeReflection; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class AOTCompilationService { public static class AOTFeature implements Feature { private final List<Class<?>> classesForAOT = new ArrayList<>(); private final List<Method> methodsForAOT = new ArrayList<>(); public void registerClassForAOT(Class<?> clazz) { classesForAOT.add(clazz); } public void registerMethodForAOT(Method method) { methodsForAOT.add(method); } @Override public void beforeAnalysis(BeforeAnalysisAccess access) { // Register classes for reflection for (Class<?> clazz : classesForAOT) { RuntimeReflection.register(clazz); RuntimeReflection.register(clazz.getDeclaredMethods()); RuntimeReflection.register(clazz.getDeclaredFields()); RuntimeReflection.register(clazz.getDeclaredConstructors()); } // Register specific methods for direct invocation for (Method method : methodsForAOT) { RuntimeReflection.register(method); } System.out.println("Registered " + classesForAOT.size() + " classes and " + methodsForAOT.size() + " methods for AOT"); } } public static void prepareForAOTCompilation() { // Register critical classes and methods for AOT compilation AOTFeature feature = new AOTFeature(); // Register compute-intensive classes feature.registerClassForAOT(ComputeIntensive.class); feature.registerClassForAOT(DynamicCompilationService.class); try { // Register specific methods Method fibMethod = ComputeIntensive.class.getMethod("fibonacci", int.class); Method piMethod = ComputeIntensive.class.getMethod("calculatePi", int.class); feature.registerMethodForAOT(fibMethod); feature.registerMethodForAOT(piMethod); } catch (Exception e) { System.err.println("Failed to register methods for AOT: " + e.getMessage()); } // In a real scenario, you would build this into a native image System.out.println("Prepared for AOT compilation"); } public static void buildNativeImage() { // This would typically be done through the native-image tool // For demonstration, we show the concept System.out.println("Building native image with pre-compiled methods..."); System.out.println("Use: native-image --features=com.example.AOTFeature MyApplication"); } } Enterprise Use Cases
1. Dynamic Rule Engine with Graal Compilation
public class DynamicRuleEngine { private final PolyglotCompilationService polyglotService; private final Map<String, CompiledRule> compiledRules = new ConcurrentHashMap<>(); public DynamicRuleEngine() { this.polyglotService = new PolyglotCompilationService(); } public static class BusinessRule { private final String id; private final String language; private final String code; private final Map<String, Class<?>> parameters; public BusinessRule(String id, String language, String code, Map<String, Class<?>> parameters) { this.id = id; this.language = language; this.code = code; this.parameters = parameters; } // Getters public String getId() { return id; } public String getLanguage() { return language; } public String getCode() { return code; } public Map<String, Class<?>> getParameters() { return parameters; } } public static class CompiledRule { private final BusinessRule rule; private final long compilationTime; private final int executionCount; public CompiledRule(BusinessRule rule, long compilationTime) { this.rule = rule; this.compilationTime = compilationTime; this.executionCount = 0; } // Getters and increment method public BusinessRule getRule() { return rule; } public long getCompilationTime() { return compilationTime; } public int getExecutionCount() { return executionCount; } public void incrementExecutionCount() { /* atomic increment */ } } public void compileRule(BusinessRule rule) { long startTime = System.currentTimeMillis(); try { // Use polyglot service to compile the rule Object result = polyglotService.executeJavaScript(rule.getCode()); CompiledRule compiledRule = new CompiledRule(rule, System.currentTimeMillis() - startTime); compiledRules.put(rule.getId(), compiledRule); System.out.printf("Rule '%s' compiled in %d ms%n", rule.getId(), compiledRule.getCompilationTime()); } catch (Exception e) { throw new RuntimeException("Failed to compile rule: " + rule.getId(), e); } } public Object executeRule(String ruleId, Map<String, Object> parameters) { CompiledRule compiledRule = compiledRules.get(ruleId); if (compiledRule == null) { throw new IllegalArgumentException("Rule not compiled: " + ruleId); } compiledRule.incrementExecutionCount(); // Prepare execution context with parameters String executionCode = prepareExecutionCode(compiledRule.getRule(), parameters); return polyglotService.executeJavaScript(executionCode); } private String prepareExecutionCode(BusinessRule rule, Map<String, Object> parameters) { StringBuilder code = new StringBuilder(); // Add parameter declarations parameters.forEach((name, value) -> { if (value instanceof String) { code.append(String.format("const %s = '%s';%n", name, value)); } else { code.append(String.format("const %s = %s;%n", name, value)); } }); // Add the rule code code.append(rule.getCode()); return code.toString(); } public void optimizeFrequentlyUsedRules() { compiledRules.values().stream() .filter(rule -> rule.getExecutionCount() > 1000) .forEach(rule -> { System.out.printf("Optimizing frequently used rule: %s (used %d times)%n", rule.getRule().getId(), rule.getExecutionCount()); // Recompile with aggressive optimizations compileRule(rule.getRule()); }); } } Graal Compiler as a Service provides unprecedented control over compilation and optimization processes in the JVM. By leveraging these APIs, developers can build highly optimized, dynamic systems that adapt to runtime behavior and achieve near-native performance for critical code paths.