# GraalVM

ES4X uses GraalVM, however the same code will run either in interpreted mode on Java 8, 9, 10 and OpenJ9.

For JDK >= 11 (with JVMCI support) or GraalVM ES4X runs in compiled mode.


In order words, please use Java >= 11 or GraalVM.

There are benefits on using GraalJS namely the updated language support >=ES6 and support out of the box for generators, promises, etc....

# Differences to Nashorn

Unlike Nashorn, GraalJS java interop follows the exact class/method name from Java. For example, the usage of property names to refer to getters and setters, must use the getter and setter. For example:

class Hello {
  private String name;

  public String getName() {
    return name;

  public void setName(String name) {
    this.name = name;

When using this Java Object from Graal, this will not work:

var hello = new Hello();
// get the name
var name = hello.name; // FAIL
// set the name
hello.name = 'Paulo';  // FAIL

This is not valid in Graal and should be:

var hello = new Hello();
// get the name
var name = hello.getName();
// set the name

# Threading

GraalJS is very strict with only a single thread on the JS context at a time. When working with only Asynchronous Vert.x APIs this shall not be an issue. However other libraries can cause problems. To avoid this limitation, it is advised to use the Worker API or the EventBus.


GraalJS will not allow multi thread access to the same script context. If there is a need to work with multiple threads, then consider looking at the Worker API.

# Native Images

Currently you cannot generate native images with ES4X, the limitation is because the static analysis of the AOT compiler will not take in consideration the java code invoked from the script (so classes won't be available), plus the fact that the compiler has no support for jvm interop at runtime.

There is work in progress in this area so it might be possible in the future.