JavaやC、Python、JavaScriptなど、複数の言語で記述されたアプリケーションを実行するための共有ランタイムを提供する多言語仮想マシンのGraalVMが、JDK 11をサポートするバージョン19.3をリリースした。これまでのGraalVMは、JDK 8をベースとしていた。
Java 9リリースからJava 11リリースの間に提供されていた、コンパクト文字列(compact strings)や変数の型推測、Java Platform Module System(JPMS)、HTTPクライアントなど、言語機能とプラットフォームの数多くの改善が、GraalVMで開発sれたJVMアプリケーションでも使用できるようになる。
例えば、次のスニペットでは、bitcoin REST APIへの簡単な要求を構築して、新しいJava 11 HTTPクライアントを使って実行する方法を示している。
public class BPI {
public static void main(String... args) {
var request = HttpRequest
.newBuilder()
.uri(URI.create("https://api.coindesk.com/v1/bpi/currentprice.json"))
.GET()
.build();
var response = HttpClient
.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofInputStream());
var json = Json
.createReader(response.body())
.readObject()
.getJsonObject("bpi");
…
System.out.printf("Current Bitcoin Price: $%s %s", price, indicator);
}
}
JAVA_HOME
とPATH
をGraalVMインストールを示すように設定することで、上例のクラスのようなJava 11ベースのクラスのjavac
によるコンパイルや、Mavenなどのツールによるビルドが可能になる。
GraalVMのネイティブイメージ生成ユーティリティも同時にアップデートされて、アーリアダプタ向けのテクノロジ機能としてJava 11をサポートするようになった。ネイティブイメージは、事前(ahead-of-time)コンパイルされたJavaバイトコードを、スタンドアロンの実行ファイルとしてパッケージしたもので、一般的にはスタートアップ時間の短縮やフットプリントの縮小が実現される。ただしネイティブイメージでは、Java Platform Moduleや、イメージ実行時のモジュールイントロスペクションがサポートされない点に注意する必要がある。native-image
ユーティリティはオプションパッケージで、GraalVM Updaterのguを使用してインストールすることができる。gu
は、GraalVMのコアディストリビューションに含まれないパッケージのダウンロードとインストールを行うための、パッケージマネージャである。
以下のスニペットでは、GraalVM native-image
ユーティリティをダウンロードして、上記の例で述べたクラスからネイティブイメージを構築して、生成されたスタンドアロン実行可能ファイルを起動する手順を示している。
gu install native-image
native-image -cp example.jar \
--enable-url-protocols=https \
my.example.BPI
ビルドツールとしてMavenを使用する場合のために、イメージ生成プロセスをアシストするMavenプラグインが提供されている。
Java 11ではGarbage-First(G1)ガベージコレクタがデフォルトであるため、パフォーマンスの重要なアプリケーションを、JDK 8ベースのGraalVMからJDK 11ベースへ移行する場合には、特別な配慮が求められる。この点にも注意が必要だ。
JDK 11サポートの他にも、GraalVM初となる今回の長期サポート(LTS)リリースでは、ネイティブイメージ生成、GraalVMコンパイラ、コードカバレッジ、GraalVM VisualVMなどのツーリングが改善され、NodeJSやPython、R言語のランタイムがアップグレードされている。リリースノートには、GraalVM 19.3リリースで提供される改善と拡張の完全なリストが掲載されている。
リソース
- JDK 11をサポートするGraalVM 19.3の発表 — GraalVMチーム (2019/11/20)
- GraalVM 19.0、待望のGAをリリース — InfoQ (2019/7/17)
- Java Feature Spotlight: Local Variable Type Inference — Brian Goetz (2019/11/1)
- Javaの新JITコンパイラ、Graalを解説 — Ben Evans (2018/7/16)