VisualVM

GraalVMは、オールインワンのJava(およびポリグロット)モニタリングおよびトラブルシューティングツールであるVisualVMをサポートしています。VisualVMは、サポートされているゲスト言語のヒープ分析を含む、強力で使いやすいJavaツールを提供します。現在、次の言語と機能が利用可能です。

  • Java: ヒープサマリー、オブジェクトビュー、スレッドビュー、OQLコンソール
  • JavaScript: ヒープサマリー、オブジェクトビュー、スレッドビュー
  • Python: ヒープサマリー、オブジェクトビュー
  • Ruby: ヒープサマリー、オブジェクトビュー、スレッドビュー
  • R: ヒープサマリー、オブジェクトビュー

VisualVMの起動 #

  1. visualvm.github.ioから最新のVisualVMをダウンロードし、解凍してアプリケーションディレクトリに移動します。

  2. アプリケーションアイコンをダブルクリックして起動します。

起動直後、ツールはアプリケーション領域にローカルで実行されているすべてのJavaプロセス(VisualVMプロセス自体を含む)を表示します。

ヒープダンプの取得 #

たとえば、後で分析するためにRubyアプリケーションのヒープダンプを取得するには、アプリケーションを起動し、数秒間実行してウォームアップします。次に、VisualVMでそのプロセスを右クリックし、「ヒープダンプ」アクションを実行します。Rubyプロセスの新しいヒープビューアが開きます。

注記: ネイティブイメージを使用する場合は、ヒープダンプサポートを明示的に有効にする必要があります。ヒープダンプ機能を有効にし、`jvmstat`を介してVisualVMがネイティブ実行ファイルを検出できるようにするには、`native-image`ツールを呼び出すときに`--enable-monitoring=heapdump,jvmstat`オプションを追加します。このようにして、アプリケーションはシグナルを処理し、`SIGUSR1`シグナルを受信したときにヒープダンプを取得します。ネイティブイメージプロセスからのヒープダンプの取得の詳細については、ネイティブヒープダンプの生成ページを参照してください。

オブジェクトの分析 #

最初は、Javaヒープのサマリービューが表示されます。Rubyヒープを分析するには、ヒープビューアツールバーの一番左(サマリー)のドロップダウンをクリックし、Rubyヒープスコープを選択してオブジェクトビューを選択します。これで、ヒープビューアに、その型別に集計されたすべてのRubyヒープオブジェクトが表示されます。

結果ビューでProcノードを展開して、この型のオブジェクトのリストを表示します。各オブジェクトは、基盤となる実装によって提供される論理値を表示します。オブジェクトを展開して、利用可能な場合はその変数と参照にアクセスします。

VisualVM: Heap Viewer Objects

次に、ツールバーのボタンをクリックしてプレビュー、変数、参照の詳細を有効にし、個々の_ProcType_オブジェクトを選択します。利用可能な場合は、プレビュービューに対応するソースフラグメントが表示され、変数ビューにはオブジェクトの変数が表示され、参照ビューには選択したオブジェクトを参照するオブジェクトが表示されます。

最後に、ヒープビューアツールバーのプリセットドロップダウンリストを使用して、ビューをすべてのオブジェクトからドミネーターまたはGCルートに切り替えます。ヒープドミネーターを表示するには、最初に保持サイズを計算する必要があります。これは、_server.rb_の例では数分かかる場合があります。ツールバーでオブジェクトの集計を選択して、個々のドミネーターまたはGCルートを表示します。

VisualVM: Heap Viewer Objects Dominators

スレッドの分析 #

ヒープビューアツールバーの一番左のドロップダウンリストをクリックし、Rubyヒープのスレッドビューを選択します。ヒープビューアには、ローカルオブジェクトを含むRubyスレッドのスタックトレースが表示されるようになりました。スタックトレースは、HTMLツールバーボタンをクリックしてテキスト形式で表示することもできます。

VisualVM: Heap Viewer Thread

JFRスナップショットの読み取り #

GraalVM 19.2.x以降にバンドルされているVisualVMツールは、JFRスナップショット(JDK Flight Recorder(以前はJava Flight Recorder)で取得されたスナップショット)を読み取ることができます。JFRは、実行中のJavaアプリケーションに関する診断データとプロファイリングデータを収集するためのツールです。Java仮想マシン(JVM)に統合されており、パフォーマンスへのオーバーヘッドはほとんどないため、負荷の高い本番環境でも使用できます。

プラグインとしてリリースされたJFRサポートをインストールするには

  1. `$JAVA_HOME/bin/jvisualvm`を実行してVisualVMを起動します。
  2. ツール > プラグイン > 利用可能なプラグインに移動して、利用可能なすべてのプラグインをリストし、_VisualVM-JFR_および_VisualVM-JFR-Generic_モジュールをインストールします。

JFRスナップショットは、ファイル > ロードアクションを使用して開くか、JFRスナップショットノードをダブルクリックしてスナップショットをJFRリポジトリに永続的に追加することで開くことができます。JFRスナップショットを作成するには、お使いのJavaバージョンのドキュメントに従ってください。

JFRビューアは、Java 7以降で作成されたすべてのJFRスナップショットを読み取り、ツールユーザーに馴染みのある典型的なVisualVMビューでデータを表示します。

VisualVM: Viewing JFR via VisualVM

現在、次のビューと機能タブを利用できます。

  • 概要タブ - 記録されたプロセスの基本情報(メインクラス、引数、JVMバージョンと構成、システムプロパティなど)を表示します。このタブでは、記録されたスレッドダンプにもアクセスできます。
  • モニタータブ - プロセスアップタイムと基本的なテレメトリ(CPU使用率、ヒープとメタスペースの使用率、ロードされたクラスの数、ライブおよび開始されたスレッドの数)を表示します。
  • スレッドタブ - 記録構成に基づいて、スナップショットに記録されたすべてのイベントに基づいて、可能な限り正確にスレッドのタイムラインを再構築します。
  • ロックタブ - ユーザーがスレッドの同期を分析できるようにします。
  • ファイルIOタブ - ファイルシステムへの読み取りと書き込みイベントに関する情報を表示します。
  • ソケットIOタブ - ネットワークへの読み取りと書き込みイベントに関する情報を表示します。
  • サンプラータブ - スレッドごとのCPU使用率とメモリ割り当て、ヒープヒストグラムを表示します。記録されたイベントからCPUスナップショットを作成するための実験的な機能「CPUサンプラー」もあります。正確なパフォーマンス分析を提供するわけではありませんが、記録されたアプリケーションで何が起こっていたのか、そしてCPUのボトルネックはどこにあるのかを理解するのに役立ちます。
  • ブラウザタブ - スナップショットに記録されたすべてのイベントの汎用ブラウザを提供します。
  • 環境タブ - CPUモデル、メモリサイズ、オペレーティングシステムバージョン、CPU使用率、メモリ使用量など、記録マシンの設定と状態の概要を示します。
  • 記録タブ - 記録設定と、イベント数、総記録時間などの基本的なスナップショットテレメトリをリストします。

注記:JDK Flight Recorderのサポートは現在実験段階です。JVM内部の分析、イベントスタックトレースの表示、ライブプロセスからのJFRスナップショットの作成のサポートなど、高度な機能の一部はこのプレビューバージョンでは利用できませんが、今後のリリースで段階的に対応される予定です。

お問い合わせ