VisualVM
GraalVMは、VisualVM (オールインワンのJava (およびポリグロット)のモニタリングとトラブルシューティング・ツール)をサポートしています。GraalVMは、サポートされているゲスト言語のヒープ分析を含む、強力で使いやすいJavaツールを提供します。現在、次の言語および機能を使用できます:
- Java: ヒープ・サマリー、オブジェクト・ビュー、スレッド・ビュー、OQLコンソール
- JavaScript: ヒープ・サマリー、オブジェクト・ビュー、スレッド・ビュー
- Python: ヒープ・サマリー、オブジェクト・ビュー
- Ruby: ヒープ・サマリー、オブジェクト・ビュー、スレッド・ビュー
- R: ヒープ・サマリー、オブジェクト・ビュー
VisualVMの起動
VisualVMは、インストール可能なコンポーネントとして出荷され、GraalVMアップデータを使用してGraalVMに追加できます:
gu install visualvm
これにより、$JAVA_HOME/bin
ディレクトリにVisualVMがインストールされます。VisualVMを起動するには、jvisualvm
を実行します:
$JAVA_HOME/bin/jvisualvm
ツールを起動するとすぐに、VisualVMプロセス自体を含むローカルで実行中のすべてのJavaプロセスが、「アプリケーション」領域に表示されます。
ヒープ・ダンプの取得
たとえば、Rubyアプリケーションのヒープ・ダンプを後で分析するために取得するには、アプリケーションを起動し、ウォームアップするまで数秒間実行します。次に、VisualVMでそのプロセスを右クリックし、ヒープ・ダンプ・アクションを起動します。Rubyプロセスの新しいヒープ・ビューアが開きます。
ノート: ヒープ・ダンプ・サポートは、ネイティブ・イメージを使用する際には明示的に有効にする必要があります。native-image
ツールを起動する際に--enable-monitoring=heapdump,jvmstat
オプションを追加して、ヒープ・ダンプ機能を有効にし、VisualVMがjvmstat
を介してネイティブ実行可能ファイルを検出できるようにします。これにより、アプリケーションでは、SIGUSR1
シグナルを受信したときにシグナルを処理し、ヒープ・ダンプを取得します。ネイティブ・イメージ・プロセスからのヒープ・ダンプの取得の詳細は、ネイティブ・ヒープ・ダンプの生成のページを参照してください。
オブジェクトの分析
最初は、Javaヒープのサマリー・ビューが表示されます。Rubyヒープを分析するには、ヒープ・ビューアのツールバーの左端にある(「サマリー」)ドロップダウンをクリックし、Rubyヒープのスコープを選択して「オブジェクト」ビューを選択します。これにより、ヒープ・ビューアに、すべてのRubyヒープ・オブジェクトがタイプ別に集計されて表示されます。
結果ビューのProcノードを展開して、このタイプのオブジェクトのリストを表示します。各オブジェクトには、基礎となる実装によって提供される論理値が表示されます。使用可能な場合は、オブジェクトを展開して変数および参照にアクセスします。
ツールバーのボタンをクリックして、「プレビュー」、「変数」および「参照」の詳細を有効にし、個々のProcTypeオブジェクトを選択します。使用可能な場合、「プレビュー」ビューには対応するソース・フラグメントが表示され、「変数」ビューにはオブジェクトの変数が表示され、「参照」ビューには選択したオブジェクトを参照するオブジェクトが表示されます。
最後に、ヒープ・ビューアのツールバーにある「初期設定」ドロップダウンを使用して、ビューをすべてのオブジェクトから「所有者」またはGCルートに切り替えます。ヒープ所有者を表示するには、保持されているサイズを最初に計算する必要があり、server.rbの例では数分かかることがあります。ツールバーの「オブジェクト」集計を選択して、個々の所有者またはGCルートを表示します。
スレッドの分析
ヒープ・ビューアのツールバーの左端にあるドロップダウンをクリックし、Rubyヒープの「スレッド」ビューを選択します。ヒープ・ビューアに、ローカル・オブジェクトを含むRubyスレッド・スタック・トレースが表示されるようになります。スタック・トレースは、HTMLツールバー・ボタンをクリックしてテキストで表示することもできます。
JFRスナップショットの読取り
GraalVM 19.2.x以降にバンドルされているVisualVMツールには、JDK Flight Recorder (以前のJava Flight Recorder)で作成されたスナップショットである、JFRスナップショットを読み取る機能があります。JFRは、実行中のJavaアプリケーションに関する診断およびプロファイリングのデータを収集するツールです。Java Virtual Machine (JVM)に統合されていて、パフォーマンスのオーバーヘッドがほとんど発生しないため、高負荷の本番環境でも使用できます。
プラグインとしてリリースされたJFRサポートをインストールするには:
$JAVA_HOME/bin/jvisualvm
を実行して、VisualVMを起動します。- 「ツール」>「プラグイン」→使用可能なプラグインに移動して、使用可能なすべてのプラグインをリストし、VisualVM-JFRモジュールおよびVisualVM-JFR-Genericモジュールをインストールします。
JFRスナップショットは、「ファイル」→「ロード」アクションを使用するか、JFRスナップショット・ノードをダブルクリックして、スナップショットをJFRリポジトリに永続的に追加することで開くことができます。JFRスナップショットを作成するには、使用するJavaバージョンのドキュメントに従ってください。
JFRビューアでは、Java 7以降から作成されたすべてのJFRスナップショットを読み取り、ツール・ユーザーによく知られている一般的なVisualVMビューでデータを表示します。
現在、次のビューおよび機能タブを使用できます:
- 「概要」タブ - 記録されたプロセスに関する基本情報(そのメイン・クラス、引数、JVMのバージョンと構成、システム・プロパティなど)が表示されます。このタブでは、記録されたスレッド・ダンプにアクセスすることもできます。
- 「モニター」タブ - プロセスの稼働時間と基本的な遠隔測定(CPU使用率、ヒープとメタスペースの使用率、ロードされたクラスの数およびライブ・スレッドと開始済スレッドの数)が表示されます。
- 「スレッド」タブ - 記録構成に基づいて、スナップショットに記録されるすべてのイベントに基づくスレッド・タイムラインが、可能なかぎり正確に再構築されます。
- 「ロック」タブ - ユーザーはスレッドの同期を分析できます。
- ファイル入出力タブ - ファイルシステムに対する読取りイベントと書込みイベントに関する情報が表示されます。
- ソケット入出力タブ - ネットワークに対する読取りイベントと書込みイベントに関する情報が表示されます。
- サンプラ・タブ - スレッドごとのCPU使用率とメモリー割当ておよびヒープ・ヒストグラムが表示されます。記録されたイベントからCPUスナップショットをビルドするための試験段階の機能として、CPUサンプラもあります。正確なパフォーマンス分析は提供されませんが、記録対象のアプリケーションでの動作状況、およびCPUボトルネックがどこで発生した可能性があるかを把握するために役立ちます。
- 「ブラウザ」タブ - スナップショットに記録されるすべてのイベントの汎用ブラウザが提供されます。
- 「環境」タブ - 記録マシンの設定および状況(CPUモデル、メモリー・サイズ、オペレーティング・システムのバージョン、CPU使用率、メモリー使用量など)の概要が表示されます。
- 記録タブ - 記録設定および基本的なスナップショットの遠隔測定(イベント数や合計記録時間など)がリストされます。
ノート: 現在、JDK Flight Recorderのサポートは試験段階にあります。JVM内部の分析、イベント・スタック・トレースの表示、ライブ・プロセスからのJFRスナップショットの作成のサポートなどの一部の拡張機能は、このプレビュー・バージョンでは使用できませんが、今後のリリースで段階的に対処されます。