Release Notes
This page highlights changes to Oracle GraalVM Enterprise Edition 20 between releases. GraalVM Enterprise comprises different components, changes to which are listed separately. Release notes are grouped in a descending order for usability reasons.
Check the GraalVM Enterprise Version Roadmap for information on the updates cadence.
Oracle GraalVM Enterprise Edition 20.3.13
(2024-01-16)
This is the January 2024 Oracle Critical Patch Update (CPU) for Oracle GraalVM Enterprise Edition 20.3.x. This release contains fixes to security vulnerabilities announced in the January 2024 Oracle Critical Patch Update Advisory. It includes the security fixes released as part of that CPU, some noteworthy bug fixes, listed below, and platform updates.
Updated the Oracle JDK release on which GraalVM Enterprise Edition is built to:
- 11.0.22+9 for Java 11-based GraalVM Enterprise. See the Java SE 11 Release Notes.
- 8u401-b10 for Java 8-based GraalVM Enterprise. See the Java SE 8u381 Release Notes.
Compiler fixes:
- The compiler now checks stamps before casting in
IntegerLessThanNode
. - Improved the loop unrolling optimization by handling stride overflow in the
int
range. - Removed explicit null check exceptions during generation of
checkcast
andinstanceof
.
Truffle tools and languages fixes:
- Upgraded the JSON parser library,org.json, to version 20231013.
- Fixed a GraalVM process not being accessible with the Chrome DevTools by adding the mandatory experimental
debuggerId
.
Oracle GraalVM Enterprise Edition 20.3.12
(2023-10-17)
This is the October 2023 Oracle Critical Patch Update (CPU) for Oracle GraalVM Enterprise Edition 20.3.x. This release contains fixes to security vulnerabilities announced in the October 2023 Oracle Critical Patch Update Advisory. It includes the security fixes released as part of that CPU, some noteworthy bug fixes, listed below, and platform updates.
Updated the Oracle JDK release on which GraalVM Enterprise Edition is built to:
- 11.0.21+9 for Java 11-based GraalVM Enterprise. See the Java SE 11 Release Notes.
- 8u391-b12 for Java 8-based GraalVM Enterprise. See the Java SE 8u381 Release Notes.
Compiler fixes:
- Fixed alternating
Phi
wrongly detected as induction variable. - Handle PiNode as subgraph root for
FoldVectorNode
.
Oracle GraalVM Enterprise Edition 20.3.11
(2023-07-18)
This is the July 2023 Oracle Critical Patch Update (CPU) for Oracle GraalVM Enterprise Edition 20.3.x. This release contains fixes to security vulnerabilities announced in the July 2023 Oracle Critical Patch Update Advisory. It includes the security fixes released as part of that CPU, and platform updates.
Updated the Oracle JDK release on which GraalVM Enterprise Edition is built to:
- 11.0.20+9 for Java 11-based GraalVM Enterprise. See the Java SE 11 Release Notes.
- 8u381+9 for Java 8-based GraalVM Enterprise. See the Java SE 8u381 Release Notes.
- Removed the Native Image support for JDK Flight Recorder (JFR) events recording.
Oracle GraalVM Enterprise Edition 20.3.10
(2023-04-18)
This is the April 2023 Oracle Critical Patch Update (CPU) for Oracle GraalVM Enterprise Edition 20.3.x. This release contains fixes to security vulnerabilities announced in the April 2023 Oracle Critical Patch Update Advisory. It includes the security fixes released as part of that CPU, and platform updates.
Updated the Oracle JDK release on which GraalVM Enterprise Edition is built to:
- 8u371+10 for Java 8-based GraalVM Enterprise. See the Java SE 8u371 Release Notes.
- 11.0.19+8 for Java 11-based GraalVM Enterprise. See the Java SE 11 Release Notes.
- Removed the old Graal Download Service (GDS) code and included a new GDS for GraalVM Updater.
Oracle GraalVM Enterprise Edition 20.3.9
(2023-01-17)
This is the January 2023 Oracle Critical Patch Update (CPU) for GraalVM Enterprise 20.3.x. This release contains fixes to security vulnerabilities announced in the January 2023 Oracle Critical Patch Update Advisory. It includes the security fixes released as part of that CPU, and platform updates.
Updated the Oracle JDK release on which GraalVM Enterprise Edition is built to:
- 8u361 for Java 8 based GraalVM Enterprise. See the Java SE 8u361 Release Notes.
- 11.0.18 for Java 11 based GraalVM Enterprise. See the Java SE 11.0.18 Release Notes.
Oracle GraalVM Enterprise Edition 20.3.8
(2022-10-18)
This is the October 2022 Oracle Critical Patch Update (CPU) for GraalVM Enterprise 20.3.x. This release contains fixes to security vulnerabilities announced in the October 2022 Oracle Critical Patch Update Advisory. It includes the security fixes released as part of that CPU, and platform updates.
Updated the Oracle JDK release on which GraalVM Enterprise Edition is built to:
- 8u351 for Java 8 based GraalVM Enterprise. See the Java SE 8u351 Release Notes.
- 11.0.17 for Java 11 based GraalVM Enterprise. See the Java SE 11 Release Notes.
Oracle GraalVM Enterprise Edition 20.3.7.1
(2022-09-20)
This is a patch release for the GraalVM Enterprise 20.3.7 branch which includes the following:
Updated the Oracle JDK release on which GraalVM Enterprise Edition is built to:
- Platform update to **11.0.16.1** for Java 11 based GraalVM Enterprise. See Java SE 11 release notes
- Removed the obsolete vscode directory.
- Fixed the
sin
,cos
, andtan
stubs.
Oracle GraalVM Enterprise Edition 20.3.7
(2022-07-19)
This is July 2022 Oracle Critical Patch Update (CPU) for Oracle GraalVM Enterprise Edition. This release contains fixes to security vulnerabilities announced in the July 2022 Oracle Critical Patch Update Advisory. It includes the security fixes released as part of that CPU, and platform updates.
Updated the Oracle JDK release on which GraalVM Enterprise Edition is built to:
- 8u341 for Java 8 based GraalVM Enterprise. See Java SE 8u341 release notes
- 11.0.16 for Java 11 based GraalVM Enterprise. See Java SE 11 release notes
Oracle GraalVM Enterprise Edition 20.3.6
(2022-04-19)
This is April 2022 Oracle Critical Patch Update (CPU) for Oracle GraalVM Enterprise Edition. This release contains fixes to security vulnerabilities announced in the April 2022 Oracle Critical Patch Update Advisory. It includes the security fixes released as part of that CPU, and platform updates.
Updated the Oracle JDK release on which GraalVM Enterprise Edition is built to:
- 8u331 for Java 8 based GraalVM Enterprise. See Java SE 8 release notes
- 11.0.15 for Java 11 based GraalVM Enterprise. See Java SE 11 release notes
Oracle GraalVM Enterprise Edition 20.3.5
(2022-01-18)
This is January 2022 Oracle Critical Patch Update (CPU) for Oracle GraalVM Enterprise Edition. This release contains fixes to security vulnerabilities announced in the January 2022 Oracle Critical Patch Update Advisory. It includes all the Oracle Java Development Kit (JDK) security fixes released as part of that CPU, and platform updates.
Oracle GraalVM Enterprise Edition 20.3.5 was updated to:
- Oracle JDK 8u321 for Java 8 based GraalVM Enterprise, please see Java SE 8 release notes
- Oracle JDK 11.0.14 for Java 11 based GraalVM Enterprise, please see Java SE 11 release notes
Oracle GraalVM Enterprise Edition 20.3.4
(2021-10-19)
This is October 2021 Oracle Critical Patch Update (CPU) for Oracle GraalVM Enterprise Edition. This release contains fixes to security vulnerabilities announced in the October 2021 Oracle Critical Patch Update Advisory. It includes all the Oracle Java Development Kit (JDK) security fixes released as part of that CPU.
Oracle GraalVM Enterprise Edition 20.3.4 was updated to:
- Oracle JDK 8u311 for Java 8 based GraalVM Enterprise, please see Java SE 8 release notes
- Oracle JDK 11.0.13 for Java 11 based GraalVM Enterprise, please see Java SE 11 release notes
Oracle GraalVM Enterprise Edition 20.3.3
(2021-07-20)
Oracle GraalVM Enterprise Edition 20.3.3 is a Critical Patch Update (CPU) release. This release contains fixes to security vulnerabilities announced in the July 2021 Oracle Critical Patch Update Advisory. It includes all the Oracle Java Development Kit (JDK) security fixes released as part of that CPU.
It also includes:
- update to 8u301 for Java 8 based GraalVM Enterprise, please see Java SE 8 release notes
- update to 11.0.12 for Java 11 based GraalVM Enterprise, please see Java SE 11 release notes
Oracle GraalVM Enterprise Edition 20.3.2
(2021-04-20)
Oracle GraalVM Enterprise Edition 20.3.2 is a Critical Patch Update (CPU) release. This release contains fixes to security vulnerabilities announced in the April 2021 Oracle Critical Patch Update Advisory. It includes all the Oracle Java Development Kit (JDK) security fixes released as part of that CPU.
It also includes:
- update to 8u291 for Java 8 based GraalVM Enterprise, please see Java SE 8 release notes
- update to 11.0.11 for Java 11 based GraalVM Enterprise, please see Java SE 11 release notes
- Node.js runtime update to 12.22.1 which contains all security fixes mentioned in April 2021 Security Releases
Oracle GraalVM Enterprise Edition 20.3.1.2
(2021-02-11)
This is a bug fix release for the GraalVM 20.3.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”.
Oracle GraalVM Enterprise Edition 20.3.1
(2021-01-19)
Oracle GraalVM Enterprise Edition 20.3.1 is a Critical Patch Update (CPU) release. It includes all the Oracle Java Development Kit (JDK) security fixes released as part of that CPU. This release fixes vulnerabilities mentioned in January 2021 Oracle Critical Patch Update Advisory.
It also includes the following:
- Update to Oracle JDK version 1.8.0_281 for Java 8 based GraalVM Enterprise, please see Java SE 8 release notes
- Update to Oracle JDK version 11.0.10 for Java 11 based GraalVM Enterprise, please see Java SE 11 release notes
Oracle GraalVM Enterprise Edition 20.3.0
(2020-11-17)
Java
- 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. - 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. - 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%.
- Improved code generated by GraalVM Enterprise for initializing newly allocated arrays, fixing a performance issue where large array allocations were initialized twice.
- 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
andV2
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.
- 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
andClass.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()
orMethodHandle.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 andTruffleInstrument.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
andContextThreadLocal
classes for details. - Added
NodeLibrary
, which provides guest language information associated with a particularNode
location, the local scope mainly andTruffleLanguage.getScope
andTruffleInstrument.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 originalTruffleException
has been deprecated. Added new interop messages for exception handling replacing the deprecatedTruffleException
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 polyglotContext
execution. The interrupt is non-destructive meaning that the polyglotContext
can still be used for further execution. - Added the ability to specify a
TargetMappingPrecedence
of target type mappings forHostAccess
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 theContext.Builder.logHandler
method has precedence over the new option. - Added experimental sandbox resource limits for languages implemented on top of the Truffle 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 respectHostAccess.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 fromjs.experimental-foreign-object-prototype
. - Changed
ToPrimitive
abstract operation to follow the specification for foreign objects.InteropLibrary.toDisplayString
is not used byToPrimitive/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
- Improved compatibility with a preliminary implementation of the ALTREP framework: http://homepage.stat.uiowa.edu/~luke/talks/uiowa-2018.pdf
- Exposed native function
match5
, which is necessary for R packagefastmatch
. - Added a few more smaller compatibility fixes and implemented missing APIs.
- More details are available from the changelog.
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 throughpyenv
. - 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
andimportlib
,decimal
,glob
, thebuiltin
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. Usingva_start
in an LLVM function that was called from a foreign language no longer forces all arguments into native memory. The resultingva_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
tograalvm/llvm/polyglot.h
andllvm/api/toolchain.h
tograalvm/llvm/toolchain-api.h
. The old header locations are deprecated, and will be removed in a future release. - Renamed
libpolyglot-mock.so
tolibgraalvm-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 Dashboard
- Re-implemented GraalVM Dashboard with OracleJET.
- Updated GraalVM Dashboard to accept new in Native Image dump format in BGV.
Oracle GraalVM Enterprise Edition 20.2.1
(2020-10-20)
Oracle GraalVM Enterprise Edition 20.2.1 is a Critical Patch Update (CPU) release. This release of Oracle GraalVM Enterprise Edition fixes vulnerabilities mentioned in October 2020 Oracle Critical Patch Update Advisory. It includes all the Oracle Java Development Kit (JDK) security fixes released as part of that CPU.
It also includes the following:
- Update Java to 8u271 for Java 8 based GraalVM Enterprise, please see Java SE 8 release notes
- Update Java to 11.0.9 for Java 11 based GraalVM Enterprise, please see Java SE 11 release notes
20.2.0
(2020-08-18)
Java
- Oracle GraalVM Enterprise Edition is based on Oracle JDK version 1.8.0_261 and Oracle JDK version 11.0.8.0.2. You can find Oracle JDK release notes for these versions at the Oracle Technology Network website.
- Added the ability to release the memory used by libgraal to the OS when an application enters a stable phase and compilation goes idle. This is achieved by attaching each compiler thread to a libgraal isolate. The number of compiler threads that can be attached to an isolate is controlled by the
jvmci.ThreadsPerNativeLibraryRuntime
system property. The default is all threads attached to a single isolate. Isolates are initialized on demand to handle extra compiler threads. When a compiler thread becomes idle (idleness delay is configurable byjvmci.CompilerIdleDelay
), it detaches itself from its isolate. As the last thread detaches from an isolate, it is shutdown and its memory (i.e., the libgraal heap) is released to the OS. This feature has the following of advantages:- It can reduce the RSS memory footprint of a GraalVM process. If the compiler is not being used, it uses no resources.
- If multiple isolates are used, it mitigates interference between complier threads. For example, there is less contention on shared objects and a garbage collection in one isolate will not pause threads in other isolates.
- Fixed an error in code generation which led to incorrect behaviour of programs using the Apache commons-compress BZip2 implementation (see #2534).
- Improved excessive compile time of certain programs (see #2548).
- Improved the optimization responsible for removing redundant read/write, array
clone()
and accesses to the cloned arrays operations. Workloads that heavily use array read/write operations, especially inside loops, in combination with allocations may benefit from this optimization. As a result of the enhanced read/write optimization, the speedups of up to 2.5x on the JetStream benchmarks were seen with GraalVM JavaScript engine. - Added an experimental partial loop unrolling optimization. Partial loop unrolling is an extended form of traditional loop unrolling optimization that works for arbitrary counted loops with an unknown upper bound of loop iterations
i
. The optimization is not enabled by default, you can experiment with the optimization by enabling it with-Dgraal.EnterprisePartialUnroll=true
. Note, the optimization is still experimental and thus may lead to unknown errors. - Improved error reporting with libgraal. Fatal errors in libgraal now produce a
hs-err
crash log that can substantially improve triaging and debugging such errors. Likewise, low level libgraal output, such as libgraal GC messages produced by-Dlibgraal.PrintGC=true
are routed to HotSpot’s log stream. That is, libgraal error handling and logging is unified with HotSpot support for these features and thus configurable by options such as-XX:LogFile
and-XX:OnError
. - Renamed the
MitigateSpeculativeExecutionAttacks
compiler option toSpectrePHTBarriers
(e.g., use-Dgraal.SpectrePHTBarriers=AllTargets
forjava
or--vm.Dgraal.SpectrePHTBarriers=AllTargets
forjs
).
Native Image
- Improved generation of native images statically linked against
muslc
. If you havemusl-gcc
on the path, you can now generate a native image statically linked against muslc with the following options:--static --libc=musl
. More information about it is available in the documentation. - Added an option to create “mostly static” native images which link statically everything except
libc
. Native images built this way are convenient to use in small docker images, for example, based on distroless/static. Enable nearly static native image generation with the following option:-H:+StaticExecutableWithDynamicLibC
. - Enabled
-H:+RemoveSaturatedTypeFlows
by default, which should result in faster native image generation and use less memory for the generation. - Changed the class initialization strategy to initialize at build time only a small part of the JDK library. To get the previous behaviour back, use
--initialize-at-build-time
option for necessary packages. - Improved the G1GC-like garbage collection for workloads where native image requires smaller GC pauses. More details are in the documentation on how to enable and configure it.
- Many other improvements and bug fixes can be found in the repository.
JavaScript
- Updated Node.js to version 12.18.0, notable changes in this release are available from the Node.JS project website.
- Updated ICU4J library to version 67.1.
- Implemented the Intl.NumberFormat Unified API proposal.
- Implemented the Logical Assignment Operators proposal.
- Implemented the Top-level Await proposal.
- Implemented the Promise.any proposal. It is available in ECMAScript 2021 mode (
--js.ecmascript-version=2021
). - Implemented support for async stack traces.
- Fixed
Date.toLocaleString
andIntl.DateTimeFormat
to use the context’s default time zone rather than the system default if no explicit time zone is requested. - Improved
js.timezone
option to validate the time zone ID and support zone offsets like “-07:00”.
Updates for Language and Tool Implementers
- Enabled by default the new inlining heuristic in which inlining budgets are based on Graal IR node counts and not on Truffle Node counts. More information can be found in the Inlining guide.
- Added support for subclassing
DynamicObject
so that guest languages can directly base their object class hierarchy on it, add fields and use@ExportLibrary
on subclasses. - Added new DynamicObjectLibrary API for accessing and mutating properties and the shape of
DynamicObject
instances. More information can be found in the Dynamic Object Model guide. - Added new identity APIs to
InteropLibrary
:hasIdentity(Object receiver)
to find out whether an object specifies identityisIdentical(Object receiver, Object other, InteropLibrary otherLib)
to compare the identity of two objectisIdenticalOrUndefined(Object receiver, Object other)
export to specify the identity of an objectidentityHashCode(Object receiver)
useful to implement maps that depend on identity
- Added Truffle DSL
@Bind
annotation to common out expression for use in guards and specialization methods. - Added the ability to disable adoption for DSL cached expressions with type node using
@Cached(value ="...", weak = true)
. - Added an option not to adopt the parameter annotated by
@Cached
, using@Cached(value ="...", adopt = false)
. - Added
CompilerDirectives.shouldNotReachHere()
as a short-cut for languages to indicate that a path should not be reachable neither in compiled nor interpreted code paths.
More details are available from the changelog.
Updates for Polyglot Embedders
- Added
Context.parse(Source)
to parse but not evaluate a source. Parsing a source allows to trigger e.g., syntax validation prior to executing the code. - Added
PolyglotException.isResourceExhausted()
to determine if an error was caused by a resource limit (e.g.,OutOfMemoryError
) that was exceeded. - Added a factory method creating a
FileSystem
based on the host Java NIO. The obtained instance can be used as a delegate in a decorating filesystem. - Added optional
FileSystem.isSameFile
method testing if the given paths refer to the same physical file. The method can be overridden by theFileSystem
implementer with a more efficient test.
More details are available from the changelog.
Tooling
VS Code
- Updated Language Server Protocol (LSP) implementation to support the latest protocol version 3.15.
- Updated VSCode extension by merging into one. More details about Visual Studio Code Extension.
- Added showing code coverage from GraalVM LSP in VS Code.
VisualVM
- Updated VisualVM to use NetBeans platform 11.3.
- Added GoToSource from VisualVM to your preferred IDE.
Ideal Graph Visualizer (IGV)
- Usability improvements for graphs identification in IGV (IGV graph now displays a dump ID and a user label with Graph name).
- Added
Go To Type
andAttach Debugger
actions. - IGV updated to NetBeans platform to 11.3.
LLVM Runtime
- Added support for
InteropLibrary.isIdentical
and related messages. - Added the
--print-toolchain-api-identifier
,--print-toolchain-api-tool <tool-name>
and--print-toolchain-api-paths <path-name>
arguments to thelli
launcher. These can be used to query the Toolchain API from the command line. - Added support for requesting locations via the
#getPaths()
method to the Java API of the Toolchain. For example, the location of the toolchain executables or libraries. - Added
llvm/api/toolchain.h
header for accessing the Toolchain from C code. - Added ability to read and write bigger values to a polyglot i8 array. For example, when reading an i64 from a foreign value that is typed as i8 array, the LLVM runtime will read 8 i8 values and combine them to an i64 result.
- Removed the
--llvm.sourcePath
option (deprecated since 19.0). Use--inspect.SourcePath
instead. - Removed support for the
application/x-llvm-ir-bitcode-base64
mime-type (deprecated since 19.0).
Python
- Improved reference counting for native extensions to prevent memory leaks.
- Added code serialization to
.pyc
files (.pyc
files persistently store the Python bytecode compiled from the source.py
files). - Fixed warning in pandas about size of the
datetime
objects. - Improved compatibility (more CPython unittests pass for core types).
- Added support for parsing requests with arguments for embedding Python.
- Added support for the basic usage of
tox
– a Python testing wrapper. - Removed support for iterables as arrays in polyglot applications.
- Added a faster implementation of
_struct
.
R
- Improved SVG support activated with the
--R.UseInternalGridGraphics=false
flag. - Improved FastR user experience: FastR should have no requirements on both Linux and MacOS i.e., installating GCC or GFortran should not be necessary to run FastR, but it may be necessary to install some 3rd party R packages.
Ruby
New features:
- Updated to Ruby 2.6.6.
- Configured Ruby to always show core library files in backtraces.
- The Java stacktrace is now shown when sending SIGQUIT to the process, also on TruffleRuby Native, see Debugging for details.
- Use
InteropLibrary#toDisplayString()
to better display objects from other languages. foreign_object.to_s
now usesInteropLibrary#toDisplayString()
(and stillasString()
ifisString()
).foreign_object.inspect
has been improved to be more useful (include the language and meta object).foreign_object.name = value
will now callInteroplibrary#writeMember("name", value)
instead ofinvokeMember("name=", value)
.- Calls to foreign objects with a block argument will now pass the block as the last argument.
foreign.name
will now useinvokeMember
if invocable and if not usereadMember
, seedoc/contrib/interop_implicit_api.md
for details.
Bug fixes:
- Fix
#class_exec
,#module_exec
,#instance_eval
, andinstance_exec
to use activated refinements (@ssnickolay). - Use upgraded default gems when installed.
- The output for
--engine.TraceCompilation
is now significantly easier to read, by having shorter method names and source names. - Fixed indentation for squiggly heredoc syntax with single quotes.
- Fixed missing flushing when printing an exception at top-level with a custom backtrace, which caused no output being shown.
Compatibility:
- Implemented
Ripper
by using the C extension. - Implemented
ObjectSpace::WeakMap
. - Supported
#refine
for Module (@ssnickolay). - Fixed
refine + super
compatibility (@ssnickolay) - Implemented
UnboundMethod#bind_call
. RUBY_REVISION
is now the full commit hash used to build TruffleRuby, similar to MRI 2.7+.- Changed the lookup methods to achieve Refinements specification (@ssnickolay)
Performance:
- Enabled lazy translation from the parser AST to the Truffle AST for user code by default. This should improve application startup time.
instance variable ... not initialized
and similar warnings are now optimized to have no peak performance impact if they are not printed (depends on$VERBOSE
).- Implemented integer modular exponentiation using
BigInteger#mod_pow
( @skateman). - Fixed a performance issue when computing many substrings of a given non-leaf
String
with non-US-ASCII characters. - Speedup native handle to Ruby object lookup for C extensions.
Changes:
- RubyGems gem commands updated to use the
--no-document
option by default.
Oracle GraalVM Enterprise Edition 20.1.1
(2020-07-14)
Oracle GraalVM Enterprise Edition 20.1.1 is a Critical Patch Update (CPU) release. It includes all the Oracle Java Development Kit (JDK) security fixes released as part of that CPU. This release fixes vulnerabilities mentioned in July 2020 Oracle Critical Patch Update Advisory.
It also includes the following:
- Java update to 8u261 for Oracle JDK 8 based GraalVM Enterprise. See Java SE 8 release notes.
- Java update to 11.0.8 for Oracle JDK 11 based GraalVM Enterprise. See Java SE 11 release notes.
Oracle GraalVM Enterprise Edition 20.1.0.1
(2020-07-06)
This is a high severity update for GraalVM Enterprise to address Java Secure
Socket Extension (JSSE) client not accepting status_request
extension in
CertificateRequest
messages (see
JDK-8236039).
Oracle GraalVM Enterprise Edition 20.1.0
(2020-05-19)
Java
- Oracle GraalVM Enterprise Edition is based on Oracle JDK version 1.8.0_251 and Oracle JDK version 11.0.7. You can find Oracle JDK release notes for these versions at the Oracle Technology Network website.
- Added new
TuneInlinerExploration
option to increase or decrease the time spent exploring inlining opportunities. Tuning this option helps to achieve better peak performance, or limit time to reach (potentially lower) peak performance which might improve overall speed of the program. This option is only a heuristic and should be tuned for a specific application. - Significantly improved performance for some benchmarks on JDK 11 due to fixes in the area of synchronization. Two notable examples of the improvements are Renaissance:reactors, and some WebLogic Server JNDI benchmarks which show approximately 50% better results.
- Added support for compiling classes with irreducible loops in the bytecode. These often occur in Kotlin applications using coroutines with loops. The support both improves performance of such applications and enables their ahead-of-time compilation.
- Added support to optimize away some redundant clone operations. For example, in
code patterns similar to the following, the GraalVM compiler will avoid creating
the array clone:
new int[length].clone().length
-
Added support for visualizing libgraal memory usage in VisualVM:
- The mitigation of the Intel Jump Conditional Code (JCC) Erratum is now only enabled for CPUs that need it.
Native Image
- Improved scalability of the static analysis: the static analysis time was
infeasible for some large applications. We added a new mechanism, called
“saturated type flows”, to make the analysis faster. The new analysis is
disabled by default for GraalVM 20.1, but we plan to enable it by default in a
future release. We encourage all users to try it out using the image builder
option
-H:+RemoveSaturatedTypeFlows
. According to our measurements, the precision of the static analysis is comparable, but if you have an application where many more classes or methods are reachable with this option please create an issue on GitHub. - Added new option for the image generator to exit handlers on termination
signals:
--install-exit-handlers
. This improves the user experience when running a native image in a Docker container as the init process, since Linux does not install a default signal handler for the process with ID “1” and the native image is therefore not reacting to a shutdown request from Docker. - Improved support for soft references: before 20.1, soft references (the Java
SoftReference
class) were cleared immediately at every GC like weak references. Now they are cleared based on a policy that takes the last access and the memory pressure into account. - Improved thin locking: Java monitor operations (the
synchronized
keyword) now use allocation-free thin locks when the lock is not contended. - Improved support for timezones: information about all timezones is now included in every image. The default timezone is correctly initialized at image startup and no longer fixed at image generation time.
- Improved checking that the native compiler toolchain is correct: for example, checking that the compiler version on Windows is correct. This avoids strange errors due to known incompatible compiler versions.
JavaScript
- Enabled ECMAScript 2020 mode features by default.
- Implemented several ECMAScript proposals, including Optional Chaining, Hashbang
Grammar, FinalizationRegistry, private class methods, RegExp Match Indices,
export * as ns from "mod"
, Intl.Locale, Intl.DisplayNames, Intl.DateTimeFormat dateStyle, and timeStyle. - Added
npx
(npm package runner) utility into GraalVM distributions. - Removed the JOni RegExp-engine and the
use-tregex
option. TRegex engine is now the default regex engine. - Removed our
SIMD.js
implementation. - Node.js is available in the Windows distribution of GraalVM Enterprise.
LLVM Runtime
- Updated musl libc to version 1.1.24.
- Added a preliminary support for running C++ code in managed mode.
- Both
libc++
andlibc++abi
are now shipped as bitcode libraries. - Improved C++ support, and
libsulong++
is loaded only iflibc++
is loaded. The executables (ELF, Mach-O) compiled with the toolchain usually have a dependency on this library and will continue to work. Plain bitcode files, which do not allow specification of dependencies, may fail with an error similar to the following:Global variable ZNSt3_15ctypeIcE2idE is declared but not defined.
This can be solved, for example, by specifying the dependency on the command line
lli --lib libc++.so.1 ...
on Linux orlli --lib libc++.1.dylib
on macOS. - Changed module initialization order to be based only on the dependencies recorded in the ELF/Mach-O file (instead of looking at imported symbols). This might change the order in which plain bitcode files are initialized since they do not allow recording dependencies. If the initialization order is important, the suggested approach is to use ELF/Mach-O files. See the Toolchain documentation for more details.
- Added support for on-stack-replacement of loops during bitcode execution: now it can compile long-running loops before the surrounding function is compiled.
Python
- Updated to Python 3.8.2.
- Improved tuples with primitive elements performance.
- Improved performance of sequences, sets, dicts, and list expressions.
- Added support of
cProfile
andtrace
modules through the GraalVM CPU sampler and coverage, respectively. - Added support of NumPy on macOS.
- Added support of
setuptools-scm
andpytz.timezone
. - Added support of a new syntax for iterable unpacking from yield and return statements.
- Fixed issues with inspection and printing of non-Python numbers in the Chrome debugger.
- Fixed issues with AST sharing across different contexts when these contexts run concurrently on multiple threads.
- Fixed passing non-ASCII strings to
gethostbyname
. - Improved Jython compatibility mode: treat Java
null
as identical to PythonNone
when comparing with theis
operator. - Improved Jython compatibility mode:
isinstance
now works with Java classes and objects. - Moved all GraalPython specific functions on
sys
orbuiltins
to the_graalpython_
module.
To see a complete list of changes, please refer to the project changelog.
R
- Preview of improved graphical support based on the
graphics
,grDevices
, andJavaGD
packages:- Use
--R.UseInternalGridGraphics=false
to activate this feature. - Our custom grid package re-implementation, which is currently the default, will be first deprecated and then removed in future releases.
- Use
- Included GCC runtime libraries for supported systems (Linux and macOS).
- Removed GFortran as a requirement to run FastR.
- The GFortran runtime libraries versions are 4.8.5 on Linux and 8.3.0 on macOS. When compiling additional R packages with Fortran code, one must use GFortran of the same or higher version.
- GFortran is now the default Fortran compiler even in the LLVM toolchain.
- Added support for
traceback()
to show frames from other GraalVM languages and C/C++ when run in the LLVM mode (--R.BackEnd=llvm
). - Improved interoperability with other languages: “@” and “$” can be used to access members of foreign polyglot objects.
A detailed list of the changes and bug fixes is available in the project changelog.
Ruby
- Added nightly builds. See the README for details.
||=
will not compile the right-hand-side if it is only executed once, to match the idiomatic lazy-initialization use-case (see the blog post).- Optimized performance of
bundle install
. - Added the
--metrics-profile-require
option to profile searching, parsing, translating, and loading files. - Changed the C API type
VALUE
to be defined asunsigned long
as on MRI. This enables usingswitch (VALUE)
and other expressions which rely onVALUE
being an integer type. - Removed deprecated
Truffle::System.full_memory_barrier
,Truffle::Primitive.logical_processors
, andTruffle::AtomicReference
. - Improved interoperability with other languages: hash keys are no longer reported as polyglot members.
- Added
Truffle::Interop.hash_keys_as_members
to treat a Ruby Hash as a polyglot object with the Hash keys as members.
For the other 56 bug fixes and 52 compatibility improvements, see the detailed changelog.
Tooling
Chrome Inspector
- Implemented the display of asynchronous stack traces in debugger, in Chrome Inspector, and in exception traces.
Language Server Protocol
- Improved stability of GraalVM Language Server and GraalVM VSCode Extensions.
- Changed to start GraalVM Language Server in the native mode for better startup performance.
- Stabilized support for LSP in R and Ruby.
VisualVM
- Enabled VisualVM to monitor libgraal memory usage.
- Implemented showing compiled and interpreter time in the GraalVM sampler.
- Improved JFR viewer to display stack traces for JFR events.
Ideal Graph Visualizer
- Added grouping of graph dumps by session:
- Added an action to go to compiler classes.
- Improved stability of IGV to no longer hang on some graph layout.
GraalVM Updater gu
- Added support for wildcards when GraalVM Updater installs from a directory (
-C
).
Updates for Polyglot Embedders
- Added
Value.isMetaObject()
,Value.getMetaQualifiedName()
,Value.getMetaSimpleName()
andValue.isMetaInstance(Object)
to allow language agnostic access to meta-objects like classes or types. - The result of
Value.getMetaObject()
will always return meta-objects. It is recommended but not required to change uses of meta-objects to useValue.getMetaQualifiedName()
instead ofValue.toString()
to return a type name. - Added OptionDescriptor.getDeprecationMessage returning the option deprecation reason. Added OptionDescriptor.Builder.deprecationMessage() to set the option deprecation reason.
- Added Context.Builder.hostClassLoader to allow an embedder to specify a context
ClassLoader
for code execution.
More changes can be found in the GraalVM SDK changelog.
Updates for Language and Tool Implementers
engine.Mode
is now a supported option and no longer experimental.- Added new meta-data APIs to
InteropLibrary
:has/getLanguage(Object receiver)
to access the original language of an objecthas/getSourceLocation(Object receiver)
to access the source location of an object (e.g., a function or classes)has/toDisplayString(Object receiver, boolean allowsSideEffect)
to produce a human-readable stringhas/getMetaObject(Object receiver)
to access the meta-object of an objectisMetaObject(Object receiver)
to find out whether an object is a meta-object (e.g., Java class)getMetaQualifiedName(Object receiver)
to get the qualified name of a meta-objectgetMetaSimpleName(Object receiver)
to get the simple name of a meta-objectisMetaInstance(Object receiver, Object instance)
to check whether an object is an instance of a meta-object
- Added
TruffleLanguage.getLanguageView
that allows to wrap the values to add language specific information for primitive and foreign values. - Added
TruffleLanguage.getScopedView
that allows to wrap the values to add scoping and visibility to language values. - Added
TruffleInstrument.Env.getScopedView
andTruffleInstrument.Env.getLanguageView
to access language and scoped views from instruments. - Added
TruffleInstrument.Env.getLanguageInfo
to convert language classes toLanguageInfo
. - Added
@GenerateLibrary(dynamicDispatchEnabled = false)
that allows to disable dynamic dispatch semantics for a library. The default istrue
. - Added ability to load external default exports for libraries using a service provider. See
GenerateLibrary(defaultExportLookupEnabled = true)
. - Added
@ExportLibrary(transitionLimit="3")
that allows the accepts condition of exported libraries to transition from true to false for a library created for a receiver instance. This is, for example, useful to export messages for array strategies. - Added support for asynchronous stack traces for languages and tools to allow debuggers to show them.
To see the full list of changes to APIs, proceed to the GraalVM Truffle changelog.
Oracle GraalVM Enterprise Edition 20.0.1
(2020-04-14)
This is a Critical Patch Update (CPU) for Oracle GraalVM Enterprise Edition 20.0. The update is to address security vulnerabilities announced in the April 2020 Oracle Critical Patch Update Advisory.
The release also includes:
- Java update to 8u251 for Oracle JDK 8 based GraalVM. See Java SE 8 release notes.
- Java update to 11.0.7 for Oracle JDK 11 based GraalVM. See Java SE 11 release notes.
For more details, refer to the My Oracle Support Note summarizing the changes required for Oracle GraalVM Enterprise Edition to implement this Critical Patch Update.
Oracle GraalVM Enterprise Edition 20.0.0
(2020-02-18)
Platform Updates
GraalVM Enterprise 20.0 improves significantly on the previously available builds
for Windows platforms. Windows is no longer an experimental platform in the GraalVM ecosystem.
Windows builds now contain the functional gu
utility to install the
components. GraalVM Native Image component needs to be installed
with gu
as on other platforms. The JavaScript engine is now included in the GraalVM Windows distribution. Node.js support on the Windows platform is scheduled to be included in the next GraalVM release (20.1).
GraalWasm - GraalVM implementation of the WebAssembly language - is distributed through the usual component distribution channels.
The GraalVM distribution for AArch64 now includes a functional node.js
runtime (both in --jvm
and native modes).
Java
- GraalVM Community Editions are based on OpenJDK version 1.8.0_242 and OpenJDK version 11.0.6.
- GraalVM Enterprise Editions are based on Oracle JDK version 1.8.0_241 and Oracle JDK version 11.0.6. You can find the JDK release notes at the Oracle Technology Network website.
- Added mitigation of Jump Conditional Code (JCC) Erratum (see #1829).
- GraalVM has a default setting of
ThreadPriorityPolicy=1
, which means thread priorities set in Java are reflected by native operating system thread priorities. This may affect Java application performance.
Native Image
- Native Image support on Windows has significantly advanced. Please report issues if you find any problems.
- Native images built with GraalVM Enterprise can now include a G1-based low latency garbage collector that reduces stop-the-world pauses and improves latency. It is an experimental feature that can be enabled at image build time with
-H:+UseLowLatencyGC
. For more details, please refer to the documentation. - Fixed several Java Native Interface (JNI) and JDK11 related issues. Refer to GitHub for more information.
JavaScript
- Updated Node.js to 12.15.0, please see Node.js 12.15.0 release notes.
- Added the
js.commonjs-require
option to load npm-compatible CommonJS modules from plain JavaScript. This is an experimental feature. See NodeJSVSJavaScriptContext.md for details. - Added the
js.load-from-classpath
option to allow loading files from the classpath via theclasspath:
pseudo URLs (disabled by default). Its usage is not recommended with untrusted code. - Added the implementation of the
String.prototype.replaceAll
proposal. It is available in ECMAScript 2020 mode (--js.ecmascript-version=2020
). - Updated
String.prototype.matchAll
to be available only in ECMAScript 2020 mode (--js.ecmascript-version=2020
). - Added the
js.bind-member-functions
option for the implicit binding of unbound functions returned byValue.getMember
to the receiver. The preferred way of calling members is usingValue.invokeMember
. - Made the support for Nashorn pseudo URLs available only in the Nashorn compatibility mode (
--js.nashorn-compat
). - Implemented support for public and private class fields, including static fields. This feature can be enabled using the experimental option
js.class-fields
and is available by default in Node.js. - Added the
js.global-arguments
option withtrue
as a default value for the non-standard arguments global property.
More details can be found in the project changelog on GitHub.
LLVM Runtime
- The toolchain is now based on LLVM 9.0.0.
- Support accessing
llvm-ar
,llvm-nm
,llvm-objcopy
,llvm-objdump
,llvm-ranlib
,llvm-readelf
,llvm-readobj
, andllvm-strip
via the toolchain.
For more details refer to the component changelog on GitHub.
Python
- Improved Jython Compatibility by implementing syntax
from JavaType import *
to import all static members of a Java class, and by enabling import of Python code from insideJAR
files by addingpath/to/jarfile.jar!path/inside/jar
tosys.path
. - Added support for date and time interop.
- Added support for setting the time zone via
Context.Builder.timeZone
. - Implemented PEP 570 - Python Positional-Only Parameters.
To see a complete list of changes, please refer to the project changelog.
R
- On Linux, the required version of
libgfortran
changed from 3 to 5. See the requirements section for details. - Implemented subsetting an array by numeric and/or string matrix.
- Fixed an issue where polyglot value is not an object (see #123).
- Fixed an issue with the incorrect formatting for
sprintf %g
and%G
(trailing zeroes, see #126). - Added R builtins and C APIs:
More details can be found in the project changelog on GitHub.
Ruby
A detailed changelog for the Ruby component is available on GitHub.
- Updated to Ruby 2.6.5 (see #1749).
- Updated the internal LLVM toolchain to LLVM 9 and reduce its download size.
- Automatically set
PKG_CONFIG_PATH
as needed for compiling OpenSSL on macOS (see #1830). - Performance improvements related to sockets and
RSTRING_PTR
. - To see the 100+ compatibility and bug fixes, please refer to the changelog.
Changes for GraalVM Embedders (SDK)
- The deprecated
graalvm.home
andgraalvm.version
system properties have been removed. Use the HomeFinder instead. - Added
EventContext.createError
which allows to introduce guest application errors in execution listeners/nodes. - Added
Context.Builder.currentWorkingDirectory
to set the current working directory used by the guest application to resolve relative paths. - Changed the algorithm used to generate a unique URI for a Source built without an URI was changed to
SHA-256
. - All Truffle Graal runtime options (
-Dgraal.
) will be deprecated with 20.1. The Truffle runtime options are no longer specified as Graal options (-Dgraal.
). The Graal options must be replaced by corresponding engine options specified using the polyglot API. TheTRUFFLE_STRICT_OPTION_DEPRECATION
environment variable can be used to detect usages of deprecated GraalVM options. When theTRUFFLE_STRICT_OPTION_DEPRECATION
is set to true and the deprecated Graal option is used, the Truffle runtime throws an exception, listing the used deprecated options and corresponding replacements.
More details are in the SDK and Truffle changelogs.
Tooling
- Added an option for
gu
to install all available components from a local directory. For example:gu install -C /path/to/downloaded/20.0-components/ native-image llvm-toolchain ruby r python wasm
. - Added a JDK Flight Recorder Data Viewer to VisualVM.
- Added an integration of T-trace instrumentation framework with OpenTracing.
- Added LLVM languages support to T-trace instrumentation framework.
- Added a Technology Preview of the Language Server Protocol implementation for GraalVM languages and its support to GraalVM VSCode Extensions.