Book Image

Supercharge Your Applications with GraalVM

By : A B Vijay Kumar
Book Image

Supercharge Your Applications with GraalVM

By: A B Vijay Kumar

Overview of this book

GraalVM is a universal virtual machine that allows programmers to compile and run applications written in both JVM and non-JVM languages. It improves the performance and efficiency of applications, making it an ideal companion for cloud-native or microservices-based applications. This book is a hands-on guide, with step-by-step instructions on how to work with GraalVM. Starting with a quick introduction to the GraalVM architecture and how things work under the hood, you'll discover the performance benefits of running your Java applications on GraalVM. You'll then learn how to create native images and understand how AOT (ahead-of-time) can improve application performance significantly. The book covers examples of building polyglot applications that will help you explore the interoperability between languages running on the same VM. You'll also see how you can use the Truffle framework to implement any language of your choice to run optimally on GraalVM. By the end of this book, you'll not only have learned how GraalVM is beneficial in cloud-native and microservices development but also how to leverage its capabilities to create high-performing polyglot applications.
Table of Contents (17 chapters)
1
Section 1: The Evolution of JVM
4
Section 2: Getting Up and Running with GraalVM – Architecture and Implementation
8
Section 3: Polyglot with Graal
13
Section 4: Microservices with Graal

Deoptimization

In the previous section, we looked at various optimization techniques that the JIT compiler performs. The JIT compiler optimizes the code with some assumptions that it makes, based on the profiling. Sometimes, these assumptions may be not correct in a different context. When JIT stumbles upon these scenarios, it deoptimizes the code and goes back to using an interpreter to run the code. This is called Deoptimization and has an impact on performance.

There are two scenarios where Deoptimization occurs:

  • When the code is "non-entrant"
  • When the code is "zombie"

Let's understand these scenarios with the help of examples.

Non-entrant code

There are two cases where the code becomes non-entrant:

  • Assumptions made during polymorphism: As we discussed in the section on monomorphic dispatch, polymorphism has a significant performance overhead on JVM. One of the optimizations that JIT performs is assuming a particular implementation...