このエントリは以下を基にしています。
This entry is based on the following entry, written by Oleg Šelajev (Developer advocate for GraalVM at OracleLabs).
https://medium.com/graalvm/graalvm-19-3-0-dfdb6f4ec8ed
本日GraalVM 19.3をリリースしました。これはJDK 11対応ならびに多数の改善を含んだものです。詳細に入る前に、フィードバックからプルリクエストによるコードの貢献に至る素晴らしい貢献をいただいたコミュニティの皆様に感謝いたします。今後も引き続きGraalVMを素晴らしいものにするために一緒にやっていきたいと考えています。
Issues
https://github.com/oracle/graal/issues
Pull Requests
https://github.com/oracle/graal/pulls
GraalVM 19.3は最初の長期サポート(LTS)リリースで、次のLTSが利用可能になるまで安定性、セキュリティ、パフォーマンスの修正を受け取ることができます。この戦略はGraalVMを使う開発者に対して優れたレベルの安定性を提供するものと考えています。
このエントリでは新たなJDK 11のサポートを取り上げます。ツール群の改善改良や、Python、Ruby、JavaScript、R、LLVMのサポートの詳細はリリースノートをご覧ください。
GraalVM 19.3.x Release Notes
https://www.graalvm.org/docs/release-notes/19_3/
JDK 11
以前のリリースと同様、GraalVMではJDK 8ベースのビルドのサポートを継続しますので、JDK 8をお使いであればGraalVM 19.3を引き続きお使い頂けます。もしJDK 11のサポートを待望されていたのであれば、お待たせしました。この19.3で、Community EditionではOpenJDK 11.0.5ベース、Enterprise EditionではOracle Java 11.0.5ベースになりました。以下のURLからダウンロードできます。
GraalVM Downloads
https://www.graalvm.org/downloads/
JDK 11ベースのGraalVMはJava 11互換なので、このビルドでJava 11が必要なJavaやJVM言語のアプリケーションを実行できます。つまり、JVMで最上位の最適化JITコンパイラとしてGraalVMコンパイラを使用しながら、OpenJDKの8から11までに導入されたすべての改善の恩恵を受けることができる、ということです。
例えば、ローカル変数の型推論も使えます。
public class HelloWorld {
public static void main(String[] args) {
var name = args.length > 0 ? args[0] : "world";
System.out.println("Hello " + name + "!");
}
}
$GRAALVM_HOME/bin/java HelloWorld.java で実行できます。
❯ $GRAALVM_HOME/bin/java HelloWorld.java "GraalVM 19.3"
Hello GraalVM 19.3!
Java 8から11に移行するにあたって、少なくとも2つの主要なパフォーマンス関連の変更、つまりcompact stringsとデフォルトGCの変更(G1GC)に注意が必要です。G1GCは、STWを小さくすることを目的としたコンカレントGCで、アプリケーションと並行して動作し、コードの全体的なスループットに影響を与える可能性があります。そのため、JDK 8ベースのGraalVMからJDK 11ベースのGraalVMに移行する場合にはご注意ください。
JEP 254: Compact Strings
https://openjdk.java.net/jeps/254
もう一つの大きな変更は、Java Platform Module System(JPMS)です。GraalVMはモジュールによるカプセル化を使ってGraalVMコンパイラのコードとTruffle APIをアプリケーションから分離しています。もちろんモジュール対応したアプリケーションも実行できます。
The State of the Module System – Accessibility
https://openjdk.java.net/projects/jigsaw/spec/sotms/#accessibility
配布の観点から、JDK 11ベースのGraalVM 19.3にはOpenJDK 11と同様にJREを含まないため、言語はGraalVMホームディレクトリにインストールされています。

GraalVM Native Image in 19.3
GraalVM Native Imageの機能でも、early adopter technology featureとしてJava 11のコードをサポートします。現時点では、ネイティブイメージビルダ($GRAALVM_HOME/bin/native-image)はJava Platform Module System (JPMS)をサポートしておらず、イメージ実行時にモジュールのイントロスペクションをしません。
これをテストするため、上記のHello worldサンプルを使ってネイティブイメージを作成してみてください。GraalVMネイティブイメージの起動時間はJDK 11ベースでもミリ秒レベルです。
❯ javac HelloWorld.java
❯ native-image HelloWorld
...❯ time ./helloworld "GraalVM 19.3 native images"
Hello GraalVM 19.3 native images!
./helloworld "GraalVM 19.3 native images" 0.00s user 0.00s system 49% cpu 0.012 total
GraalVM 19.3で、JDKのネイティブコードを手作業で提供するのではなく、JDKのネイティブコードを静的にリンクするように切り替えました。この変更は、WindowsでJDK 11ベースのGraalVMディストリビューションを可能にする主要な要因です。また、これによるネイティブイメージの起動時間やメモリフットプリントへの影響はなく、libsunec.soのようなJDKライブラリをJava cryptoサービスを使うネイティブイメージとともに配布する必要がなくなります。全体として、GraalVM Native Imageテクノロジーのメンテナンスがより簡単になり、新しいJavaバージョンをサポートするためのGraalVMのアップグレードが簡単になりました。
Maven Updates
19.3でのもう一つの重要な変更は、GraalVM Native Imageに関連するJARファイルのMaven coordinateです。group idがcom.oracle.substratevm から org.graalvm.nativeimage に変わりました。Native ImageのためにMavenプラグインを使う場合、pom.xmlに以下のエントリを記載する必要があります。
<plugin> <groupId>org.graalvm.nativeimage</groupId> <artifactId>native-image-maven-plugin</artifactId> <version>19.3.0</version> <executions> <execution> <goals> <goal>native-image</goal> </goals> <phase>package</phase> </execution> </executions> </plugin>
Conclusion
GraalVM 19.3は非常に重要なリリースで、ソーシャルメディアやGitHubのIssueコメントで大いに関心があった数多くの新機能や改善を含んでいます。このリリースではJava 11ベースのビルド、ARM64ビルド、Node.jsサポートの12.xのLTSブランチへのアップグレード、アプリケーションの挙動の可視性を高める新しいツール、などなどの変更点があり、これらはリリースノートで確認頂けます。
是非ダウンロードしてお試しいただき、何かありましたらフィードバックください。将来のリリースにあるとうれしい機能を教えてください。また、GraalVMのデプロイメントをさらに強化したい場合は、パフォーマンスがさらに向上し、カスタマーサポートを含むGraalVM Enterpriseをご検討ください。
GraalVM Downloads
https://www.graalvm.org/downloads/
GraalVM: Run Programs Faster Anywhere
https://github.com/oracle/graal
Oracle GraalVM Enterprise Edition
https://oracle.com/graalvm