This is a bug fix release for the GraalVM 21.0.x branch. It contains operational changes to GraalVM Updater - a tool for installing optional GraalVM language runtimes and utilities, and for updating your local GraalVM installation.

  • Enhanced the upgrading policies to prevent components not being upgraded when migrating from GraalVM Community to GraalVM Enterprise Edition (gu upgrade --edition ee).
  • Improved handling the license acceptance by gu when a user is prompted to accept “Oracle GraalVM Enterprise Edition Native Image License”.




Updated the underlying JDK GraalVM is built on:

  • GraalVM Community Edition is based on OpenJDK version 1.8.0_282 and OpenJDK version 11.0.10.
  • Oracle GraalVM Enterprise Edition is based on Oracle JDK version 1.8.0_281 and Oracle JDK version 11.0.10. You can find Oracle JDK release notes for these versions at Oracle Java SE Downloads.

Java on Truffle

  • Added an experimental Java Virtual Machine implementation based on a Truffle interpreter. Read more here.

Container Images

GraalVM Community images for Docker containers changed the location and now are available from GitHub Container Registry. See the guide.

Platforms Support

As of this version, we provide GraalVM distributions for Linux on AArch64 system. All components including the GraalVM core are experimental. GraalVM Enterprise Edition is based on Oracle JDK11 for AArch64, and GraalVM Community Edition on OpenJDK 11 for AArch64 architecture accordingly.

Native Image

  • Added serialization support for Native Image. The serialization support ensures constructors for classes are contained in a native image, so that they can be deserialized in the first place. These classes should be whitelisted in an additional specific configuration file, similar to the Reflection continuation, as some classes cannot be deserialized, including classes that might be part of the native image, but not listed in the configuration file. You can either create a configuration file manually or apply a Tracing Agent, provided with GraalVM, to help writing the configuration files.
  • Added method handle invocation support for Native Image (see #2761). Methods and fields accessed through method handles have to be registered in the Reflection configuration file. Also added method handles support to the Tracing agent to automatically generate the configuration for the native image build. Most use cases of method handles are supported. VarHandles that are not stored in static fields are still not supported.
  • Added AWT and Swing support for the Linux platform (configuration collection with the Tracing agent is necessary).
  • Added the experimental -H:+InlineBeforeAnalysis option to reduce the number of required configuration entries and lessen the image size.
  • Improved the Tracing agent: it now captures instances of Class.getClasses and Class.getDeclaredClasses.
  • Improved the ServiceLoaderFeature class to scan for services declared using modules.
  • Disallowed the instances of Random in the native image heap.
  • Improved GC performance (less time spent in GC).

Updates for Language and Tool Implementers Using Truffle API

  • Fixed many issues related to multi-tier compilation. Multi-tier compilation (--engine.MultiTier) will be enabled by default in 21.1.
  • Added HostCompilerDirectives for directives that guide the host compilations of the Truffle interpreters:
  • HostCompilerDirectives.BytecodeInterpreterSwitchto denote methods that contain the instruction-dispatch switch in bytecode interpreters
  • HostCompilerDirectives.BytecodeInterpreterSwitchBoundary to denote methods that do not need to be inlined into the bytecode interpreter switch
  • Truffle DSL generated nodes are no longer limited to 64 state bits. Use these state bits responsibly.
  • More changes are listed in the changelog.

Updates for Polyglot Embedders

  • Added support for explicitly selecting a host method overload using the signature in the form of comma-separated fully qualified parameter type names enclosed by parentheses (e.g., methodName(f.q.TypeName,java.lang.String,int,int[])).
  • Deprecated the host method selection by JNI mangled signature, replaced by the aforementioned new form. Scheduled for removal in 21.2.


  • Updated Node.js to version 12.20.1.
  • Enabled the following ECMAScript 2021 mode/features by default:
    • Class fields
    • Promise.any
    • String.prototype.replaceAll
    • Logical Assignment Operators
  • Adopted a new interop exception handling and made JS exceptions extend the AbstractTruffleException class.
  • Exposed Graal.versionECMAScript instead of Graal.versionJS.
  • Implemented the relative indexing method proposal. It is available in ECMAScript 2022 mode (--js.ecmascript-version=2022).


  • Added the jarray module for compatiblity with Jython.
  • Improved the support for Pandas and added the initial support for the Matplotlib visualization library.
  • Provided fixes to avoid possible memory leaks and crashes when running NumPy in a shared engine.
  • Fixed an infinite continuation prompt in REPL when pasting snippets.

More details can be found in the changelog.


  • The new IRB is quite slow when copy/paste code into it. This is due to an inefficient io/console implementation which will be addressed in the next release. A workaround is to use irb --readline, which disables some IRB features but is much faster for copy/pasting code.

New features:

  • Updated to Ruby 2.7.2. Most Ruby 2.7 features and changes are implemented (see #2004).

Bug fixes:

  • Fixed setting of special variables in enumerators and enumerables (issue #1484).
  • Fixed issue with Method#to_proc and special variable storage (issue #2156).


  • **kwargs now accept non-Symbol keys like Ruby 2.7.


  • Refactor and implement more performant MatchData#length (see #2147).
  • Refactor and implement more performant Array#sample (see #2148).
  • String#inspect is now more efficient.


  • All InteropLibrary messages are now exposed consistently as methods on Truffle::Interop (see #2139). Some methods were renamed to match the scheme described in the documentation.
  • More details are available from the changelog.


  • Fixed AssertionError when trying to install the R validate package (issue #169).

LLVM runtime

  • Improved the AST sharing, and support for the auxiliary engine caching. On top of the regular AST sharing that allows sharing code between multiple contexts in a single engine, this allows persisting of shared code across process boundaries.
  • Added support for the current major release of macOS (macOS Big Sur).


  • Added a deprecation warning for the old header files locations polyglot.h and llvm/api/toolchain.h. These header files have been already deprecated in 20.3.0, but without a warning.


  • This release included a large number of bugfixes in semantics, linking and in-module validation. GraalVM’s WebAssembly interpreter now passes almost all tests from the official specification test suite.
  • Exposed Polyglot bindings that are needed for the JS-to-WebAssembly Interface API.
  • Optimized the GraalWasm interpreter, leading to warmup and an overall 20x peak performance improvement of the interpreted execution mode.
  • Improved the security by using the byte-buffer-based memory instead of the off-heap memory.


GraalVM Updater

Starting from version 21.0, GraalVM Updater has become more powerful and can be used to update your GraalVM local installation to a newer version or upgrade from a Community to Enterprise Edition. Read more in Upgrade GraalVM.

Visual Studio Code Extensions

GraalVM Dashboard

  • Improved the BGV format to support large amount of integer properties.


  • Enabled a seamless import of settings from the previous installations of VisualVM.

Connect with us