gu install native-image ruby R python
Find the detailed release notes here. Let’s dive into main improvements in GraalVM 19.1 and then discuss more details on the versioning scheme.
One of the challenges of just-in-time (JIT) compilation systems is the need to make the compilation step as fast as possible. We have been recently analyzing an example workload where GraalVM in JIT mode is used to run the Scala sbt build tool for compiling a fresh checkout of the Apache Spark repository. The workload runs for a bit more than 3 minutes. When looking at the activity of the GraalVM just-in-time compilation threads with Java Mission Control, we see that they are busy during the whole run:
When the optimal machine code is finally ready to execute, the workload is already finished. Installing that machine code earlier is central to making such medium length programs run faster. We, therefore, made several improvements for increased just-in-time compilation speed. Specifically, we are now using profile-guided optimizations when creating the native image for our compiler itself. Also, we improved heuristics of our optimizations to make them less computationally intensive. The result is almost twice the compilation speed:
The workload now finishes with ~30% less CPU time consumed by our compilations. Having the better machine code available earlier reduces the overall total execution time of the workload by 13%. This is an important improvement for medium length programs.
As the GraalVM project evolves fast and has many different components, it has been a challenge for us to find an appropriate versioning scheme. GraalVM as a polyglot virtual machine project would like to move forward quickly and embrace the needs of all the languages it supports. We want to have frequent releases that allow developers to enjoy the latest improvements and try the newest features.
Currently, there’s one release branch of GraalVM: 19. Next year, we will release GraalVM 20, the year after GraalVM 21, and so on. During the year there are going to be several releases from the main line of the project: 19.1, 19.2, 19.3, and so on. The plan is to have these releases approximately every 3 months and to follow the updates to the platforms GraalVM depends upon: OpenJDK, Node.js, LLVM, Ruby, R, Python.
These releases are going to be built from master and include the latest bits. We intend to make the update process smooth and only gradually introduce new features. This means first having major changes behind an experimental flag and only later enabling that flag by default. This allows us to keep a high velocity for the project while allowing users to adjust well in advance.
On top of these major releases, we will create update releases, which only include important bug fixes and security updates. We create such update releases for the last major release and distinguish them by the third digit. We recently made, for example, a 19.0.2 update release for the 19.0 major release. The current plan is to enable longer term support for the last release of the year, so 19.3 (or 19.4) will receive updates after 20.0 is released. We are working on publishing a release calendar with exact dates so users can plan ahead.
We are looking forward to feedback on this release. At the same time, we continue to move ahead and are already excited to work on the next GraalVM 19.2 release.
Go get GraalVM and build stuff!