原文はこちら。
https://medium.com/graalvm/jfr-support-in-visualvm-62fddd4f0795
JDK Flight Recorder サポートのプレビューが、GraalVM 19.2と同梱されているVisualVMプラグインとしてリリースされました。このプラグインがJava 7以後で作成された全てのJFRスナップショットを読み取り、VisualVMの画面に表示します。
JDK Flight Recorder (JFR、以前は Java Flight Recorder でした)は実行中のJavaアプリケーションの診断データやプロファイルデータを収集するツールです。Java Virtual Machine (JVM)に統合されているためほとんどパフォーマンスに影響しません。そのため、高負荷の本番環境でも利用できます。

現在ご利用いただける機能とビューは以下の通りです。
タブ | 説明 |
---|---|
Overview | 例えばmainクラスや引数、JVMバージョン、構成、システムプロパティといった、記録されたプロセスに関する基本的な情報を表示。 このタブでは記録されたスレッドダンプへのアクセスも可能。 |
Monitor | プロセスの起動時間と基本的なテレメトリ(CPU利用量、ヒープや目メタスペースの利用状況、ロードされたクラスの個数や動作中、開始済みのスレッド個数など)を表示。 |
Threads | 記録の設定をベースに、できる限り詳細にスナップショットに記録した全てのイベントに基づいてスレッドのタイムラインを再構築して表示。 |
Locks | スレッドの同期を分析できる |
File IO | ファイルシステムへの読み書きイベントに関する情報を表示 |
Socket IO | ネットワークへの読み書きイベントに関する情報を表示 |
Sampler | スレッドごとのCPU利用率やメモリ割り当て、ヒープのヒストグラムを表示。記録イベントからCPUスナップショットを生成するCPU samplerという実験的な機能もある。正確なパフォーマンス分析はできないが、それでも記録されたアプリケーションで何が起こっていたのか、CPUボトルネックの可能性はどこなのかを理解する上では有用。 |
Browser | スナップショットに記録された全てのイベントの汎用ブラウザ |
Environment | 記録マシン構成や状況(CPUモデル、メモリサイズ、OSのバージョン、CPU利用状況、メモリ利用状況など)の概要を確認できる |
Recording | 記録の構成と基本的なスナップショット・テレメトリ(イベントの件数、全記録時間など)をリスト表示 |
JVM内部の分析(analyzing JVM internals)、イベントスタックトレースの表示や活動中のプロセスからのJFRスナップショット作成のサポートは現在のプレビュー版ではご利用いただけませんが、今後のリリースで漸次対応していく予定です。

JFRサポートをインストールするには、
- GraalVM 19.2以後のリリースをダウンロードしてインストール
https://www.graalvm.org - <GRAALVM_HOME>/bin/jvisualvm を起動してVisualVMを開始
- Tools | Plugins | Available Pluginsを使って、利用可能な全てのプラグインを見て、 VisualVM-JFR と VisualVM-JFR-Generic モジュールをインストール
File | Load… もしくはJFRスナップショットノードをダブルクリックしてJFRスナップショットを開くことができます。スナップショットは永続的にJFRリポジトリに追加できます。
JFRスナップショットを作成するには、ご利用のJavaバージョンのドキュメントに従ってください。GraalVM Enterpriseの場合、以下のパラメータをjavaコマンドに追加すればJFRスナップショットを作成できます。
<GRAALVM_HOME>/bin/java -XX:+UnlockCommercialFeatures
-XX:StartFlightRecording=duration=10s,filename=filename.jfr -jar ...
OpenJDK 8ではJFRをサポートしていないため(ここで言っているJFRはJDK Flight Recorder)、GraalVM 19.2 CEでJFRスナップショットを作成することができません。OpenJDK 11以後のリリースを使ってJFRスナップショットを作成してください。
<OPENJDK11_HOME>/bin/java -XX:StartFlightRecording=duration=10s,filename=filename.jfr -jar ...

Trying it out
Javaアプリケーションでテストしたいものの、すぐに使えるお気に入りのアプリケーションがない場合は、たとえばSpring PetclinicというサンプルWebアプリケーションでお試し頂けます。クローンしてビルドし、準備しましょう。
A sample Spring-based application
https://github.com/spring-projects/spring-petclinic
git clone https://github.com/spring-projects/spring-petclinic.git
mvn clean package -DskipTests=true
# verify it works:
<GRAALVM_HOME>/bin/java -jar target/spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar
上記手順でサンプルアプリケーションが動作し、 localhost:8080 からアクセスできます。
やるべきことは、javaコマンドに上記のコマンドラインオプションを追加するだけです。これでFlight Recorderがプロファイル情報を収集します。
<GRAALVM_HOME>/bin/java -XX:+UnlockCommercialFeatures -XX:StartFlightRecording=dumponexit=true,filename=petclinic.jfr -jar target/spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar
dumponexit=true コマンドでは、アプリケーションの実行の最後にファイルに書き出します。別のオプションでは記録の時間を指定しています。
アプリケーションを開き、クリックしていってみてください。もし、wrkのような負荷生成ツールを持っているのであれば、より意味のあるサンプルワークロードを生成できます。
A constant throughput, correct latency recording variant of wrk
https://github.com/giltene/wrk2
例えば、以下のコマンドは30秒間実行中のアプリケーションのWebページの一つに負荷をかけます。
wrk -d30s -R2000 http://localhost:8080/owners\?lastName\=
アプリケーションを停止し、petclinic.jfrファイルが存在することを確認して、先ほどの説明に従いVisualVMに読み込みます。
VisualVMからJFRがアプリケーションの記録をした日を調査できます。

JFRはパフォーマンス分析に最適なツールの1つです。GraalVM Enterpriseでの処理を改善したいワークロードがある場合は、GitHubなどでGraalVMチームに連絡できます。最適化の機会があれば調査を試みます。
GraalVM: Run Programs Faster Anywhere 🚀
http://github.com/oracle/graal
VisualVMでのJFRサポートについてのフィードバックをお待ちしています。次のバージョンでどの機能をご覧になりたいかお知らせください。この記事(もちろん原文にお願いします)のコメント欄、http://visualvm.github.io/feedback.htmlにコメントを残す、もしくは、https://github.com/oracle/visualvm/issuesでRFE/bugを提出してください。
Feedback
http://visualvm.github.io/feedback.html
Issues
https://github.com/oracle/visualvm/issues