20.3.0 #

(2020-11-17)

Java #

  • GraalVM Community Edition is based on OpenJDK version 1.8.0_272 and OpenJDK version 11.0.9.
  • [GraalVM Enterprise] Oracle GraalVM Enterprise Edition is based on Oracle JDK version 1.8.0_271 and Oracle JDK version 11.0.9. You can find Oracle JDK release notes for these versions at the Oracle Technology Network website.
  • Improved eliminating or delaying class loading from libgraal until after its initialization. This improves performance on workloads with very short iterations (in milliseconds). It also fixes problems related to VM assumptions about the JIT compiler not loading classes, which could lead to races and sometimes deadlocks.
  • [GraalVM Enterprise] Improved conditional move optimization: GraalVM Enterprise contains an optimization that uses the CPU’s conditional move (CMOV) instruction to implement certain conditional statements. In this release we have improved this optimization to give higher and more predictable performance for workloads sensitive to conditional move instructions.
  • [GraalVM Enterprise] Improved heuristics in GraalVM Enterprise for loop peeling optimization for workloads where the first iteration initializes array objects lazily. This is a common pattern in GraalVM’s Python runtime of Python iterators. It results in performance improvements for micro Python benchmarks of up to 40%.
  • [GraalVM Enterprise] Improved code generated by GraalVM Enterprise for initializing newly allocated arrays, fixing a performance issue where large array allocations were initialized twice.
  • [GraalVM Enterprise] Improved the heuristics for the code duplication optimization in GraalVM Enterprise which gives a peak performance improvement of up to 17% on some LLVM workloads and a 5% increase on some Java workloads.

Native image #

  • Improved container awareness: on Linux, the resource limits - processor count, memory size - are read from cgroup V1 and V2 configurations. The processor count can also be overridden on the command line using the option -XX:ActiveProcessorCount=.
  • Improved the “isolated compilation” that separates applications and the runtime compiler from each other, which improves performance by reducing interference between them, for example, due to garbage collection.
  • [GraalVM Enterprise] The G1 garbage collector now also supports native images that use runtime-compiled code. It can be enabled at image build time using the option --gc=G1. G1 support is currently limited to Linux on AMD64. Windows and macOS support will be available in future releases. G1 now also supports performance counters (when the image is built with -H:+AllowVMInspection).
  • Improved the options to enable and disable assertions which now support the full syntax to specify package and class names. Assertions need to be configured at image build time, using the options -ea / -da / -esa / -dsa. The definition of “system assertions” is expanded to not only include assertions in the JDK, but also in the Native Image runtime system, for example, in the garbage collector implementation.
  • Added basic debug information generation on Windows (developed in collaboration with Red Hat).
  • Added many small performance and memory footprint optimizations. In particular, a new implementation of type checks improves the performance of Class.isInstance and Class.isAssignableFrom with less type data in the image heap.
  • Added support for method handles that represent a call to a single method accessible by the Reflection API, with no transformations applied through the Method Handles API, such as calls to MethodHandle.bindTo() or MethodHandle.asType(). To enable this feature use --report-unsupported-elements-at-runtime.
  • Many other bug fixes and improvements which can be found in the GitHub repository.

Updates for Language and Tool Implementers #

  • Enabled by default the elastic allocation of the compiler threads depending on the number of available processors, in both JVM and native modes. The old behaviour, 1 or 2 compiler threads, can be explicitly enabled with --engine.CompilerThreads=0.
  • Added ThreadsActivationListener to listen to the thread enter and leave events in instruments.
  • Added new flags to inspect the expansion during partial evaluation: --engine.TraceMethodExpansion=truffleTier, --engine.TraceNodeExpansion=truffleTier, --engine.MethodExpansionStatistics=truffleTier and --engine.NodeExpansionStatistics=truffleTier. Language implementations are encouraged to run with these flags enabled and investigate their output for unexpected results. See Optimizing.md for details.
  • Added TruffleInstrument.Env.getOptions(TruffleContext) to retrieve context specific options for an instrument and TruffleInstrument.getContextOptions() to describe them. This is useful if an instrument wants to be configured per context.
  • Added the ability to create context and context thread locals in languages and instruments. See ContextLocal and ContextThreadLocal classes for details.
  • Added NodeLibrary, which provides guest language information associated with a particular Node location, the local scope mainly and TruffleLanguage.getScope and TruffleInstrument.Env.getScope, which provides a top scope object of a guest language.
  • Added ByteArraySupport: a helper class providing safe multi-byte primitive type accesses from byte arrays.
  • Added a new base class for the exceptions, see AbstractTruffleException. The original TruffleException has been deprecated. Added new interop messages for exception handling replacing the deprecated TruffleException methods.
  • Added new specialization utility to print detailed statistics about specialization instances and execution count. See Specialization Statistics for details on how to use it.
  • More details are available from the changelog.

Updates for Polyglot Embedders #

  • Added Context.interrupt(Duration) to interrupt a polyglot Context execution. The interrupt is non-destructive meaning that the polyglot Context can still be used for further execution.
  • Added the ability to specify a TargetMappingPrecedence of target type mappings for HostAccess configurations that influence conversion order and precedence in relation to default mappings and other target type mappings.
  • Added a log.file option that allows redirection of all languages, instrument or engine logging to a file. The handler configured with the Context.Builder.logHandler method has precedence over the new option.
  • [GraalVM Enterprise] Added experimental sandbox resource limits for languages implemented on top of the Language Implementation framework.
  • More details are available from the changelog.

JavaScript #

  • Updated Node.js to version 12.18.4.
  • Fixed field/getter/setter access order in a Nashorn compatibility mode, see #343.
  • Fixed “Multiple applicable overloads found” error in a Nashorn compatibility mode, see #286.
  • Enabled low precedence lossy number, string-to-boolean, and number-to-boolean conversions in a Nashorn compatibility mode.
  • Fixed Java.extend to respect HostAccess.Builder.allowImplementations, see #294.
  • Added Java host interoperability support for mapping JavaScript objects to abstract classes (if HostAccess allows it).
  • Added js.foreign-object-prototype as a supported option to set JavaScript prototypes for foreign objects mimicing JavaScript types. It was renamed from js.experimental-foreign-object-prototype.
  • Changed ToPrimitive abstract operation to follow the specification for foreign objects. InteropLibrary.toDisplayString is not used by ToPrimitive/ToString conversions anymore.

Ruby #

  • Added handling foreign null object as falsy value (#1902).
  • Improve reliability of the post install hook by disabling RubyGems (#2075).
  • Fixed the top level exception handler to print exception cause (#2013).
  • Fixed handling of post arguments for super() (#2111).
  • Fixed constant/identifier detection in lexer for non-ASCII encodings (#2079, #2102).
  • Fixed parsing of --jvm as an application argument (#2108).
  • Added checking bounds for FFI::Pointer accesses when the size of the memory behind is known.
  • Implemented negative line numbers for eval (#1482).
  • Migrated from JLine 2 to JLine 3 for the readline standard library.
  • Added various warmup improvements, notably much less splitting and more operations are done inline, without a call.
  • Improved setting and access to the special variables $~ and $_ which has been refactored to require less splitting.
  • More details are available from the changelog.

R #

Python #

  • Updated Python to version 3.8.5.
  • Added the experimental new HPy native API, so it is possible run piconumpy through HPy now.
  • The standalone graalpython version can now be installed through pyenv.
  • Many fixes to pass the unittests of standard library types and modules: complex, bytes, bytearray, subclassing of special descriptors, type layouts, float, generators, modules, argument passing corner cases, string literals and encodings, import and importlib, decimal, glob, the builtin module, json, math, operator, numeric tower, sys, warnings, random, f-strings, struct, itertools, super.

LLVM runtime #

  • Added support for code sharing in the GraalVM LLVM runtime. This allows the AST and compiled code of common bitcode libraries to be shared between multiple contexts within a single engine improving performance.
  • Updated LLVM toolchain to version 10.0.0.
  • Improved for va_list / varargs handling across language boundaries. Using va_start in an LLVM function that was called from a foreign language no longer forces all arguments into native memory. The resulting va_list object can be passed to code written in other languages, and accessed there using standard interop APIs.
  • Introduced the Handles API for storing managed pointers in native memory.
  • Moved polyglot.h to graalvm/llvm/polyglot.h and llvm/api/toolchain.h to graalvm/llvm/toolchain-api.h. The old header locations are deprecated, and will be removed in a future release.
  • Renamed libpolyglot-mock.so to libgraalvm-llvm.so. The old name is deprecated and will be removed in a future release.

Tooling #

Visual Studio Code Extensions

  • Enhanced a VSCode GraalVM Extension with:
    • Java syntax highlighting
    • Java code completion
    • Installation wizard to download and install GraalVM Community or GraalVM Enterprise from the UI
    • Integrated Java debugger with all the features you would expect from a full featured IDE debugger like the Netbeans IDE
    • Integrated Polyglot debugger allowing to debug Javascript, Python, R, Ruby and other GraalVM languages
  • Implemented a VS Code Micronaut extension which:
    • Leverages all the great features of the Graal VS Code Extension for Java
    • Includes a Micronaut project wizard for creating new Micronaut applications
    • Includes Gradle and Maven support
    • Includes support to easily create a native executable from a Micronaut Gradle application using GraalVM Native Image

GraalVM and Micronaut Extensions

GraalVM Dashboard

GraalVM Dashboard Interface