このエントリは以下のエントリをベースにしています。
This entry is based on the folllowing one written by
https://medium.com/graalvm/graalvm-19-2-new-tools-b78a70f54b06
本日GraalVM 19.2がリリースされました。
これは19.1に続くメジャーリリースで、変更点はリリースノートをご覧いただきたいのですが、トピックは以下の通りです。
- 改善されたprofile-guided optimization
- LLVM toolchain
- Java Flight Recorderのサポートを備えたVisualVMの機能強化
- Visual Studio Codeプラグイン(プレビュー)
- ネイティブイメージのピークパフォーマンスの改善
GraalVM 19.1: Compiling Faster
https://medium.com/graalvm/graalvm-19-1-compiling-faster-a0041066dee4
https://logico-jp.io/2019/07/06/graalvm-19-1-compiling-faster/
リリースノート
https://www.graalvm.org/docs/release-notes/19_2/#1920
フィードバックや問題を報告くださったコミュニティのみなさま、このリリースにマージされたプルリクエストをお寄せいただいたみなさまに感謝いたします。
IssueとPull request
https://github.com/oracle/graal/issues
https://github.com/oracle/graal/pulls
以後はアップデートやバージョンのロードマップの詳細です。このまま読み続けてくださるもよし、いますぐダウンロードして試すもよし・・・。
GraalVM Downloads
https://www.graalvm.org/downloads/
Profile-Guided Optimizations
JVMで動作するGraalVM just-in-time (JIT) モードは起動時にランタイム情報を収集し、それを使用してマシンコードを最適化する機能があるため、高いピークパフォーマンスを求められる状況に適しています。GraalVM ahead-of-time (AOT)モードは、起動時とメモリ消費量の面で優れていますが、ランタイム情報がないため、ピーク時のパフォーマンスが低下します。このデメリットを低減するために、GraalVMチームはGraalVM Enterprise Editionにプロファイルガイド付き最適化(profile-guided optimizations、PGO)を実装しました。 PGOを使用すると、プロファイリングデータを事前に収集し、それをGraalVMの native-image ユーティリティに送り、この情報を使用してバイナリを生成します。これにより、(PGOなしのバイナリに比べて)パフォーマンスを最適化できます。
GraalVM 19.2までは、PGOを適用するためには、まずインストルメント済みのネイティブイメージバイナリをビルド、実行した上で、プロファイルを収集する必要がありました。この機能を使うことで、アプリケーションをJITモードで実行して収集したプロファイルを使用して高度に最適化されたネイティブバイナリを生成できます。
How to enable PGO
-
-Dgraal.PGOInstrument
フラグをつけてJITモードでJavaプログラムを実行し、プロファイル情報を収集する。$ /graal-ee-19.2.0/bin/java -Dgraal.PGOInstrument=myclass.iprof MyClass
- 収集したデータを使ったネイティブイメージを生成する。
$ /graal-ee-19.2.0/bin/native-image --pgo=myclass.iprof MyClass
- 高速起動、高スループットのバイナリイメージの準備完了。
$ ./myclass
Java Flight Recorder
Java Flight Recorder (JFR) は実行中のJavaアプリケーションの診断データやプロファイルデータを収集するツールです。特定時点でのJVMやJavaアプリケーションで発生するイベントを収集します。

GraalVMにバンドルされているVisualVMで、Java Flight Recorderファイル (.jfr) のデータを可視化する機能がプレビューで使えるようになりました。
JFRサポートを有効化するには、
- まず、
$GRAALVM_HOME/bin/jvisualvm
を実行してVisualVMを起動する - Tools > Plugins > Available Plugins を使って利用可能な全てのプラグインをリスト表示し、 VisualVM-JFR と VisualVM-JFR-Generic モジュールをインストールする

JFR スナップショットを File > Load… もしくはJFRスナップショットノードをダブルクリックして開き、スナップショットを永続的にJFRリポジトリに追加します。JFRスナップショットの作成については、お使いのJavaバージョンのドキュメントをご覧ください。
JFRのサポートは現在プレビュー機能です。フィードバックは以下からどうぞ。
VisualVM Feedback
http://visualvm.github.io/feedback.html
バグ、機能リクエストはIssueを立ててください。
GraalVM GitHub Issues
https://github.com/oracle/visualvm/issues
Performance Improvements
すべての構成でパフォーマンスが若干向上しました。 大きなアップデートの一つとして、GraalVM Enterprise Editionのネイティブイメージでデフォルトのスループットが改善されたことがあげられます。GPOなしでMicronautのサンプルをGraalVMで実行したときの結果を測定しました。
Creating your first Micronaut Graal application
https://guides.micronaut.io/micronaut-creating-first-graal-app/guide/index.html
19.2では、100万のリクエストに対して、CPU時間が最大10%短縮し、単位時間あたりにおけるCPU1個あたりのリクエストのスループットが最大10%向上しています(訳注:原文はCPU secondという表現を使っています。CPUあたりという表現もおそらく1コアあたりと表現すべきでしょうが、詳細不明のため、CPUあたりとしています)。GraalVMのjust-in-time (JIT) 構成に比べるとスループットはまだ低いですが、AOT構成を同じレベルにするための進歩を続けています。

LLVM Toolchain
GraalVMには LLVM bitcodeエンジンを同梱しており、このエンジンを使ってLLVM bitcodeにコンパイル可能なC/C++やその他の言語を実行できます。Although compiling C/C++をbitcodeにコンパイルすること自体は、clangやllvm-linkといった標準的なLLVMツールで可能ですが、特にmakeのようなリンク・ビルドシステムが登場する場合は注意が必要です。GraalVM LLVMランタイムを対象とするネイティブプロジェクトを構築する際に、コンパイラを単純に置き換えてすぐ使える機能をtoolchainで提供することにより、このプロセスを簡素化することを目指しています。
How to get started
GraalVM 19.2をダウンロードし、LLVM toolchainを以下のコマンドを使って追加します(Community EditionとEnterprise Editionで違いはありません)。
gu install llvm-toolchain
toolchainを使って”Hello World!”のC++プログラムを実行します。
$ $GRAALVM_HOME/jre/languages/llvm/native/bin/clang++ hello-c++.cpp -o hello
$ $GRAALVM_HOME/bin/lli hello
LLVM toolchainの詳細を知りたい方は以下のドキュメントをご覧ください。
Running LLVM on GraalVM
https://www.graalvm.org/docs/reference-manual/languages/llvm/
toolchainは現時点ではまだ実験的 (experimental) であることにご注意ください。機能の追加、変更、削除の可能性があります。
GraalVM Extension for Visual Studio Code
実験的なVS Code extensionの第1版をリリースしました。このextensionはGraalVMで動作するプログラムの編集とデバッグの基本的なサポートを提供します。
GraalVM Support for VS Code
https://github.com/oracle/graal/tree/master/vscode/graalvm
以下のデバッグ設定を利用できます。
- Node.jsアプリケーションの起動
- JavaScriptの起動
GraalVMを使うJavaScriptをデバッグモードで起動します。 - アタッチ
ローカルで実行中のGraalVMにデバッガをアタッチします。 - リモートへのアタッチ
リモートのGraalVMのデバッグポートにデバッガをアタッチします。
エディターで開かれたJavaScriptソースの場合、すべての Polyglot.eval(…) 呼び出しが検出され、それぞれの埋め込み言語がその場所に挿入されます。
引き続きこのプロジェクトに取り組んでおりますので、フィードバックやご提案を承っております。
Version Roadmap
予測可能なリリース日とアップデートリリースに関する情報を含むバージョンロードマップの説明を作成しました。以下のURLにあるリリースツリーの図の下にあります。
Version Roadmap
https://www.graalvm.org/docs/release-notes/version-roadmap/
将来的には、次のメジャーリリースで計画されている機能を追跡できるプロセスを導入する予定にしています。

GraalVM 19.2をダウンロードして新機能をお試しください。
GraalVM Downloads
https://www.graalvm.org/downloads/
フィードバックをお待ちしています。GraalVMのGitHubリポジトリにIssueを立ててもらってもいいですし、何らかの方法でメッセージをお寄せいただいても結構です。
GraalVM GitHubリポジトリ
https://github.com/oracle/graal
GraalVM Community
https://www.graalvm.org/community/