6 リアルタイムJMXモニタリング

Java管理コンソール(JMX)が実行中のJVMに接続し、主な特性をリアルタイムに収集して表示します。このツールは、実行中のJVMインスタンスをモニターおよび管理するためのものです。このツールによって、メモリーとCPU使用状況、ガベージ・コレクション、スレッド・アクティビティなどのライブ・データが提供されます。また、JVMおよびJavaアプリケーションのMBeanのモニターおよび管理に使用できる完全な機能を持つJMX MBeanブラウザも含まれています。

「概要」タブ

JMXコンソールを起動するには、JVMブラウザで目的のJVMを右クリックして、「JMXコンソールを開始します」を選択します。

JMXコンソールには、デフォルトで、「JMXデータ永続性の設定」および「ダッシュボード」パネルを含む「概要」タブが表示されます。「プロセッサ」および 「メモリー」チャートも表示されます。

ダッシュボードのデフォルトのダイヤルには、メモリー使用率、JVMでのCPU使用率、ライブ・セットと断片化に関する情報が表示されます。

「概要」タブでは、ダイヤルおよびチャートを追加、削除および編集できます。

ダイヤルの追加または編集

「ダッシュボード」パネルの右上隅の「属性の追加」(プラス記号(+)ボタン)をクリックします。たとえば、ダイアログが開いたら、「フィルタ」テキスト・フィールドにFreePhysicalMemorySizeと入力して「終了」をクリックします。「空き物理メモリー」ダイヤルがダッシュボードに追加されます。ダイヤルの名前とそのプロパティを編集するには、ダイヤルを右クリックします。ダイヤルのグラデーションの値を設定したり、色を設定したり、ウォーターマークを表示するかどうかを選択できます。

チャートの追加または編集

「概要」タブの隣にある 「チャートの追加」(プラス記号(+)ボタン)をクリックします。チャートが追加されたら、チャート・パネルの右上隅にある「属性の追加」((+)ボタン)をクリックして、目的の属性を追加します。たとえば、ダイアログが開いたら、「フィルタ」テキスト・フィールドにThreadCountと入力して「終了」をクリックします。スレッド数チャートがページに追加されます。属性リストを右クリックして「色の編集」を選択すると、スレッド数チャートの色を変更できます。タイトルの変更やイメージとしてのエクスポートなど、その他のチャートの操作を行うには、チャートのコンテキスト・メニューを使用します。

ノート:

「概要」タブをリセットするには、ページの右上隅の「デフォルト・コントロールにリセット」ボタンをクリックします。

JMXデータ永続性

JMX属性を使用して、永続データを収集し、分析のために格納できます。JMCはGUIで開いたり表示したりできるファイルにJMXデータを保持します。

データ永続性の有効化

「JMXデータ永続性の設定」パネルは、「概要」タブの上部に縮小されています。リストの属性のデータ永続性を有効にするには、「概要」タブの右上隅の「JMXデータ永続性のアクティブ化」ボタンをクリックします。

設定への属性の追加
リストに属性を追加するには、「JMXデータ永続性の設定」パネルの右上隅の「属性の追加」ボタンをクリックします。「追加する属性の選択」ダイアログから属性を選択し、「終了」をクリックします。

ノート:

リストから属性を削除するには、リストを右クリックして、「削除」を選択します。
JMXデータ永続性ファイルの表示
JMXデータ永続性データは、永続性ディレクトリ内のバイナリ・ファイルに格納されます。デフォルトでは、このディレクトリは、USER-HOME/.jmc/7.x.x/persisted_jmx_dataにあります。永続性ディレクトリには、データ永続性が有効にされたJVM接続の名前に対応するフォルダが含まれます。各JVM接続フォルダには、データ永続性が有効にされた属性の名前のあるサブフォルダが含まれます。これらのサブフォルダには、*.persisted_jmx_dataという名前のログ・ファイルと、series.infoという名前の追加メタデータ・ファイルが含まれます。ログ・ファイルは、「JMXデータ永続性」ウィンドウにドラッグ・アンド・ドロップして表示できます。

ノート:

永続性ディレクトリは変更できます。
  • Windows OSの場合、JMCアプリケーションを開き、「ウィンドウ」「プリファレンス」「JDK Mission Control」「JMXコンソール」の順に選択し、「JMXデータ永続性」を選択します。参照して目的のディレクトリを選択し、変更を適用します。
  • macOSの場合、JMCアプリケーションを開き、「JDK Mission Control」「プリファレンス」「JDK Mission Control」「JMXコンソール」の順に選択し、「JMXデータ永続性」を選択します。参照して目的のディレクトリを選択し、変更を適用します。

「MBeanブラウザ」タブ

「MBeanブラウザ」タブでは、JVM内部のJMXサーバーおよびJavaアプリケーションにデプロイされているMBeanをモニターおよび管理できます。

ブラウザでは、登録されたすべてのMBeanにアクセスできます。MBeanを使用して、デバイス、アプリケーション、または管理が必要なすべてのリソースを表すことができます。大規模な属性のコレクションが見やすくなるよう、ブラウザで自動的に値がサブグループにグループ化されます。プリファレンスを変更することで、このグループ化を制御できます。MBeanのプリファレンスの詳細は、JDK Mission Controlのヘルプを参照してください。

MBeanブラウザを使用すると、属性の特定の値の表示、属性の更新間隔の変更、チャートへの属性の追加、通知の表示を行えます。

新規Mbeanの作成と登録

新規MBeanを作成して登録するには、「MBeanツリー」パネルの上部にあるプラス記号(+)ボタンをクリックし、「新規MBeanの動的な作成と登録」ダイアログで新規MBeanの有効なオブジェクト名とクラス名を指定します。特定のMBeanを登録解除するには、右クリックして「MBeanツリー」パネルのコンテキスト・メニューから「登録解除」を選択します。

属性の更新間隔

「属性」表の属性の間隔を更新するには、属性を右クリックして、「更新間隔の変更」を選択します。更新間隔は、次のいずれかの値に設定できます:

  • デフォルト: デフォルトの更新間隔設定。
  • 1回: 属性は1回のみフェッチされます。たとえば、オペレーティング・システム名にこの間隔を選択できます。
  • カスタム: ミリ秒(ms)で指定されたカスタム更新間隔。たとえば、CpuLoad属性を2000ミリ秒に変更できます。この場合、CPU負荷は2秒に1回フェッチされます。

属性の値の変更

値を更新できるのは、太字でレンダリングされている属性のみです。たとえば、「MemoryPool」「Compresses Class Space」MBeanの順に選択して、「属性」サブタブに移動します。リストで、「UsageThreshold」属性を右クリックします(この属性が太字で表示されていることに注意してください)。「値」フィールドをダブルクリックするか、右クリックして「値の変更」を選択し、しきい値を変更します。

属性の視覚化
属性を「概要」タブでチャートとして視覚化するには、次のステップに従います:
  1. 「MBeanツリー」パネルから任意の属性を選択します。たとえば、「java.lang」から「Threading」を選択します。
  2. 「MBeanの機能」パネルで、「ThreadCount」を右クリックして「視覚化」を選択します。
  3. 「チャートの作成」ダイアログで、「チャートの追加」をクリックし、チャートの新しい名前を入力します。
  4. 「OK」をクリックします。

    ThreadCountチャートが「概要」タブに追加されます。

ノート:

属性の値がブール値の場合、チャートとして視覚化することはできません。
通知の表示

「通知」サブタブでは、選択したMBeanで使用可能なJMX通知を表示できます。すべてのMBeansにそのような情報があるわけではなく、(通知が使用可能な場合)通知をサブスクライブする必要があります。たとえば、「java.lang」下の「GarbageCollector」MBeanを選択し、「G1古い世代」を選択します。「通知」サブタブに移動し、「サブスクライブ」チェック・ボックスを選択します。通知は、通知の日時で構成される名前が付いた表の別個のエントリとして「ログ」パネルに追加されます。エントリを展開し、通知の詳細を表示します。

診断コマンドの起動

「MBeanブラウザ」タブを使用して、診断コマンドを起動できます。たとえば、「操作」サブタブをクリックして、com.sun.managementドメインから「診断コマンド」を選択します。コマンドのリストから「vmInfo : String」コマンドを選択して、「実行」をクリックします。結果は出力パネルに表示されます。

「トリガー」タブ

「トリガー」タブでは、特定の条件が満たされた場合に、イベントをトリガーするルールを定義およびアクティブ化できます。

ルールは、次のコンポーネントで構成されます:

  • 条件: トリガーをアクティブ化するタイミングを指定します。たとえば、CPU負荷が90%を超えた場合にトリガーをアクティブ化します。
  • アクション: 条件が満たされた場合に実行するアクションを指定します。たとえば、詳細を含む電子メールを送信したり、フライト記録を開始します。
  • 制約: トリガー条件に対する追加の制約。たとえば、平日にのみトリガー・アラートを送信します。

「トリガー」タブでは、ルールを追加、削除、名前変更、アクティブ化および非アクティブ化できます。ルールはエクスポートおよびインポートできます。「トリガー・ルール」パネルには事前定義のルールがいくつか含まれています。「ルールの詳細」パネルで、これらの既存のルールを変更できます。

トリガーの設定

条件が満たされた場合にフライト記録を自動的に開始するようJMCを設定するには、次の手順に従います。これは、特定のJVMランタイムの問題を追跡する場合に有用です。

  1. 「トリガー」タブで、「追加」ボタンをクリックします。アプリケーション内の任意のMBean(アプリケーションに固有のMBeanを含む)を選択できます。
  2. 表示された「新しいルールの追加」ダイアログで、ルールをトリガーする属性を選択し、「次」をクリックします。たとえば、「java.lang」「OperatingSystem」「ProcessCpuLoad」の順に選択します。
  3. ルールがトリガーされる条件を設定し、「次」をクリックします。たとえば、「最大トリガー値」「持続期間」および「制限期間」の値を設定します。

    ノート:

    「条件に合致したときにトリガーします。」および「条件から復帰したときにトリガーします」チェック・ボックスを選択できます。
  4. トリガーされたときにルールで実行するアクションを選択し、「次」をクリックします。たとえば、「期限付きフライト記録の開始」を選択し、ファイル宛先および記録時間を参照します。トリガーされたらフライト記録が自動的に開くようにする場合は、「自動的に開く」チェックボックスを選択します。
  5. ルールに対する制約を選択し、「次」をクリックします。たとえば、ルールをアクティブにする特定の日付、曜日または時刻を選択します。
  6. 新しいルールの名前を入力し、「終了」をクリックします。

    ルールが「トリガー・ルール」パネルの「ルール」リストに追加されます。

「トリガー・ルール」リストからルールを選択すると、「ルールの詳細」ペインの「条件」「属性」および「制約」タブにそのコンポーネントが表示されます。必要に応じて編集できます。

「システム」タブ

「システム」タブには、JVMが実行されているシステムのリソースに関する情報、JVMのパフォーマンス属性、およびシステム・プロパティのリストが表示されます。

「サーバー情報」パネルには、JVMが実行されているサーバーに関するカテゴリのリストと値が表示されます。この情報は、アプリケーションの開発および実行時の問題のデバッグ、およびサポート要求への対応に役に立ちます。この一般システム情報は変更できません。

「JVM統計」パネルには、JVMのキー・パフォーマンス属性の現在値が表示されます。デフォルトでは、次の属性が表に表示されます。

  • 現在ロードされているクラス件数
  • 稼働時間

属性を「JVM統計」表に追加するには、「JVM統計」パネルの右上隅の「属性の追加」ボタンをクリックします。属性を変更するには、属性を右クリックして、削除、更新間隔などの操作を実行し、一部の属性については値を変更します。

「システム・プロパティ」ペインには、JVMのキーおよびシステム・プロパティの表が表示されます。このパネルには検索機能があり、キーまたは値でシステム・プロパティをフィルタできます。たとえば、 java.vmで始まるプロパティを表示するには、フィルタ・テキスト・ボックスにjava.vmと入力します。

「メモリー」タブ

「メモリー」タブでは、アプリケーションがメモリー・リソースをどれだけ効率的に使用しているかモニターできます。このタブは、ヒープ使用率、ガベージ・コレクションおよびアクティブ・メモリー・プールを扱います。このタブで提供される情報は、最適なアプリケーション・パフォーマンスを提供するようにJVMを構成したかどうかを判断するのに役立ちます。

「メモリー」タブを使用すると、メモリー・リークをすばやく絞り込むことができます。メモリー・リークは、ヒープ内のオブジェクトへの参照がアプリケーションにより誤って保持され、ガベージ・コレクションによって解放されない場合に発生します。意図せずに保持されているこれらのオブジェクトは、時間の経過とともにヒープ内で増大し、やがてJavaヒープ領域を一杯にします。その結果、ガベージ・コレクションが頻繁に行われ、最終的にOutOfMemoryErrorでプログラムが終了します。

タブの右上隅にある「完全ガベージ・コレクションを実行します」ボタンを使用して完全ガベージ・コレクションを手動で開始し、ヒープ・ダンプを分析します。

ヒープ・ヒストグラム

クラスごとのヒープでのメモリー割当てのスナップショットを表示するには、「ヒープ・ヒストグラムのリフレッシュ」ボタンをクリックします。これによりオーバーヘッドが生じる可能性があることを知らせる警告メッセージが表示されます。出力には、ヒープ内の各クラス・タイプのインスタンス数、合計サイズおよびデルタが表示されます。最初のヒープ・ヒストグラムが取得されると、これがベースラインになり、デルタがゼロに設定されます。後続のヒストグラムが取得されるたびに、前のヒストグラムに対するデルタが表示されます。「デルタ計算のリセット」を押すと、現在取得されているスナップショットがベースラインとして使用されます。ヒストグラムを連続して(たとえば、2分ごとに)取得すると、傾向を観察でき、詳細な分析につなげることができます。

アプリケーションでjava.lang.OutOfMemoryErrorが発生した場合は、ヒープ・ヒストグラムを分析して問題を診断します。java.lang.OutOfMemoryErrorが発生したときにメモリー内に存在していたオブジェクトとそれらが使用していたメモリーのサイズが示されます。

GC表

「GC表」パネルには、G1若い世代やG1古い世代など、使用可能なガベージ・コレクタのキー・パフォーマンス属性の現在の値が含まれます。コレクション数は、様々な問題の分析に役立ちます。たとえば、若いコレクションの数が多いことが、レスポンス時間の問題の原因である場合があります。古い世代の使用率がガベージ・コレクション(GC)後に増加せず、大きく変動する場合、オブジェクトが若い世代から古い世代に不必要にコピーされています。

属性を右クリックして間隔、単位を更新し、一部の属性については値を変更します。

アクティブ・メモリー・プール

メモリー不足は、GCアクティビティが増加する主な理由です。したがって、様々なメモリー・プール(Eden、SurvivorおよびOld)の利用率をモニターすることが重要です。そのためには、「アクティブ・メモリー・プール」パネルを分析します。このパネルには、JVMで使用可能なメモリー・プールに関する情報が表示されます。

「スレッド」タブ

「スレッド」タブには、アプリケーションでのスレッドの実行に関する情報が含まれます。

ライブ・スレッド・グラフ

「ライブ・スレッド・グラフ」をクリックすると、Javaアプリケーションによって開始されたスレッドの数が表示されます。グラフには、デフォルトで次の属性が含まれています:

  • デーモン・ライブ・スレッド数: ライブ・デーモン・スレッドの数が表示されます。
  • ピーク・ライブ・スレッド数: ピーク・ライブ・スレッドの数が表示されます。
  • 合計ライブ・スレッド数: ライブ・スレッドの合計数が表示されます。

グラフへの属性の追加。

「ライブ・スレッド」グラフに属性を追加するには、「属性の追加」ボタンをクリックします。「追加する属性の選択」ダイアログで、必要な属性を追加します。たとえば、DeadlockedThreadCountを追加して「終了」をクリックします。

「ライブ・スレッド」表

「ライブ・スレッド」表には、使用可能なすべてのスレッドが、スレッド名、スレッドの状態、ブロックされた数などの情報とともに表示されます。表内のスレッドをフィルタリングするには、フィルタ・テキスト・ボックスにフィルタ文字列を入力します。たとえば、すべてのAWTスレッドを表示するには、AWTと入力します。

スレッドのリアルタイムのモニター

スレッドをリアルタイムにモニターするには、「CPUプロファイリング」「デッドロック検出」および「割当て」チェック・ボックスを選択します。これらのチェック・ボックスは、有効にするとシステム・リソースを多く消費するため、デフォルトではすべて無効になっています。

表内の列の表示/非表示

列を追加するには、スレッド名を右クリックして「表示可能列」を選択します。リストから、表示または非表示にする列を選択します。

スタック・トレース

スレッドが選択されている場合は、そのスタック・トレースが「選択したスレッドのスタック・トレース」パネルに表示されます。スタック・トレースには、現在実行されているメソッドまでのすべてのメソッドのコール・パスが含まれ、問題の原因となったメソッドの検出に役立ちます。

診断コマンド

「診断コマンド」タブには、実行中のJVMに送信できるコマンドがリストされます。

コマンドによって、Javaアプリケーションの効率性とパフォーマンスをモニターできます。また、ターゲットJavaアプリケーションのパフォーマンス統計、Java Flight Recorder (JFR)、メモリー使用量、ガベージ・コレクション、スレッド・スタックおよびJVMランタイムに関する情報の取得にも役立ちます。

診断コマンドは「操作」リストにあり、右側のパラメータを構成できます。コマンドを実行するには、「操作」リストからコマンドを選択し、その引数値を入力して「実行」ボタンをクリックします。結果は出力パネルに表示されます。

コマンドの詳細な説明を参照するには、「操作」リストでコマンドを選択して「ヘルプ」ボタンをクリックします。

診断コマンドは、実行時に発生するパフォーマンス・オーバーヘッドに応じて分類されます:

  • 標準コマンド: これらのコマンドは、iという文字が円で囲まれたアイコンで示されます。これらは一般的な診断情報を提供します。たとえば、JFR.dumpです。
  • 拡張コマンド: これらのコマンドには、三角形に感嘆符(!)が付いたアイコンで示されます。これらはリソースをより必要とし、JVMパフォーマンスにも影響しますが、情報をさらに提供します。たとえば、JFR.startです。
  • 内部コマンド: これらのコマンドは、逆三角形に感嘆符(!)が付いたアイコンで示されます。これらのコマンドは、非常に詳細な診断情報を提供しますが、JVMのパフォーマンスに大きく影響します。その影響は、Javaヒープのサイズと内容によって異なります。たとえば、GC.heap_dumpです。

影響が中程度か、高いか、不明な診断コマンドを実行すると、警告メッセージが表示されます。この設定は、プリファレンスで制御できます。特定の影響度の診断コマンドに対して警告を表示しない場合は、対応するチェック・ボックスの選択を解除します。