1 JDK Mission Controlの新機能 8
JDK Mission Control (JMC)は、Javaアプリケーションの管理、モニター、プロファイリングおよびトラブルシューティングのための高度なツール・セットです。JMCを使用すると、プロファイリング・ツールやモニタリング・ツールに通常伴うパフォーマンス・オーバーヘッドを発生させることなく、コードのパフォーマンス、メモリー、待機時間などの領域について、効率的で詳細なデータ分析を行うことができます。
ノート:
グラフ、フレーム、ヒート・マップ、依存関係などのスタック・トレース・グラフ・ビューは、現在LinuxおよびMacでサポートされています。依存関係ビュー
依存関係ビューには、階層エッジ・バンドルを使用したイベントの集計が表示されます。たとえば、パッケージ間の依存関係を視覚化するのに役立ちます。
JMCで依存関係ビューを有効にするには、メニュー項目「ウィンドウ」、「ビューの表示」、「その他」、「Mission Control」、依存関係表示の順に移動します。「開く」をクリックします。
データ表現には、次の2つのモードがあります:
コード図
コード図では、パッケージが円の周りに放射状に配置されて表示され、円弧によりデータ・ポイントが結ばれて依存関係が示されます。
図1-1 コード図
エッジ・バンドル
エッジ・バンドル・ビジュアライゼーションで、パッケージの上にカーソルを置くと、特定の色で強調表示された依存関係が表示されます:
- 緑: パッケージの上にカーソルを置くと、そのパッケージ内のメソッドにより、リンクされたパッケージ内のメソッドがコールされます。
- 黄: リンクされたパッケージ内のメソッドにより、マウスが置かれたパッケージ内のメソッドがコールされます。
- 赤: リンクされたパッケージ内のメソッドおよびマウスが置かれたパッケージ内のメソッドにより相互にコールされます。
図1-2 エッジ・バンドル
パッケージの深さ
グラフのサイズを制御するには、特定のレベルでパッケージ階層の深さを選択できます。これにより精度は低下しますが、視覚的な検査が容易になります。
たとえば、パッケージの深さを3に設定すると、パッケージはjava.util.zip
と表示されます。ただし、パッケージの深さを2に設定すると、パッケージはjava.util
と表示されます。階層の深さは、選択した値に従って設定されます。デフォルトでは、パッケージの深さの値は2に設定されます。
グラフ・ビュー
グラフ・ビューには、集計スタック・トレースと累積数が表示されます。スタック・トレースがグラフィカルな形式で表示され、メソッド・パスのルートまでの識別に役立ちます。
JMCでグラフ・ビューを有効にするには、メニュー項目「ウィンドウ」→「ビューの表示」→「その他」→「Mission Control」→「グラフ・ビュー」の順に移動します。「開く」をクリックします。
次に、スレッド情報が表示されたグラフ・ビューのサンプル・イメージを示します:
図1-3 グラフ・ビュー
スマート・プルーニングにより、大きなグラフをレンダリングすることもできます。最も影響の大きいノードに集中できます(ノードは、メソッド・コールなどのデータ・ポイントです)。「最大ノード数」ドロップダウンで、ノードのターゲット数を選択すると、ビジュアライゼーションにより、多くのノードの最大数がレンダリングされます。
ヒートマップ・ビュー
ヒートマップ・ビューは、スタック・トレース内の特定の期間中に発生したイベントを視覚的に表現します。値は色分けされ、複雑なデータを一目で分析するのに役立ちます。
JMCでヒートマップ・ビューを有効にするには、メニュー項目「ウィンドウ」→「ビューの表示」→「その他」→「Mission Control」→「ヒートマップ・ビュー」の順に移動します。「開く」をクリックします。
ヒートマップ・ビューのサンプル・イメージを次に示します:
図1-4 ヒートマップ・ビュー
各セルは、特定の期間中に記録されたイベントを表します。色によって、特定の期間中に発生した様々なイベントが示されます。
フレーム・グラフ・ビュー
フレーム・グラフ・ビューには、JFRイベントによって収集された集計スタック・トレースが表示されます。これは、根本原因分析を素早く把握し、時間を短縮するために役立ちます。
JMCでフレーム・グラフ・ビューを有効にするには、メニュー項目「ウィンドウ」→「ビューの表示」→「その他」→「Mission Control」→フレーム・ビューの順に移動します。「開く」をクリックします。
図1-5 フレーム・ビュー
フレーム・グラフ・ビューには次の機能があります:
- スタック・トレースはボックスの列として表され、各ボックスは関数(スタック・フレーム)を表します。
- X軸はスタック・トレース・コレクションを示し、Y軸はスタック深度を示します。
- ボックスの幅は、関数の出現頻度を示します。幅の狭いボックスに比べて、幅の広いボックスほど関数の出現回数が多くなります。
- 検索フィールドを使用して特定の用語を検索でき、正規表現を含めることもできます。検索された関数が強調表示されます。また、一致したスタック・トレースの合計が、プロファイル全体に対する割合としてフレーム・グラフに表示されます。これは、関数を見つけるだけでなく、関数の論理グループを強調表示するためにも役立ちます。
- グラフの向きを切り替えるには、フレーム・グラフまたはアイシクル・グラフ・アイコンを選択します。アイシクル・グラフは上から下の向きに表示され、フレーム・グラフは下から上の向きに表示されます。
必要な属性を選択して、フレーム・グラフおよびスタック・トレースを集計できます。サンプルドロップダウンで、「割当サイズ」または「TLABサイズ」を選択します。選択したサンプルに従って、フレーム・ビューまたは「スタック・トレース」ビュー(あるいはその両方)が表示されます。
JFRスタック・トレースにアクセスするためのWebsocketサーバー
JMCでJFRイベントを選択すると、ユーザー定義のポートを介して、関連付けられたスタック・トレースにJSONデータとしてアクセスできます。視覚化は、ブラウザで直接プログラムによって制御できます。これにより、データ視覚化ツールを使用して視覚化を開発または変更できます。
Websocketサーバー・ポートはデフォルトで無効になっています。有効にするには、「Windows」→「プリファレンス」→「JDK Mission Control」→「フライト・レコーダ」の順にクリックします。「フライト・レコーダ設定」ダイアログで、「Websocketサーバー・ポート」フィールドにポート番号を指定します。ポートを無効にするには、0を設定します。
JMCエージェント
JMCエージェントは、アプリケーションを再起動することなく、実行中のJVMやアプリケーションにカスタムJFRイベントをインストゥルメントまたは挿入するために使用します。JMCエージェントを使用するために、アプリケーションのソース・コードにJFRインストゥルメンテーションをプログラミングする必要はありません。
次に、JMCエージェントの機能と利点を示します:
- XML構成を使用して、インジェクト・イベントを定義できます
- 実行時にイベントを動的に追加できます
- JVMエージェントは非常に汎用性が高く、エージェントをいつでも動的にロードまたはサイドロードできます
- 発生するフットプリントは最小限です。発行するのはイベント関連の関数呼出しのみです
- ソースを使用できない場合の本番での使用に適しています
JMCエージェント・プラグインを使用すれば、管理する構成は事前に定義されたもので、結果の変換に関する最新の情報も表示できます。
JMCエージェントを起動するには、「JVMブラウザ」タブでJMCエージェントをクリックします。エージェントを起動するための前提条件は次のとおりです:
- エージェントJARのビルド:
agent.jar
をビルドするには、JMCエージェントのReadmeを参照してください。JMCエージェントの起動ダイアログで、エージェントJARファイルを参照して接続します。エージェントのビルドには、最新バージョンのコードを使用します。 - xmlファイルでのJFRイベントの定義: xmlファイルを手動で作成しても、JMCエージェント・プリセット・マネージャ(XMLファイルを作成するためのユーザー・インタフェース)を使用してもかまいません。
ノート:
- インストゥルメントに必要なターゲット・アプリケーションがJDK 11以上で実行されている場合は、JVM引数
--add-opens java.base/jdk.internal.misc=ALL-UNNAMED
を使用してアプリケーションを実行します。 - インストゥルメントに必要なターゲット・アプリケーションがJDK 8で実行されている場合は、JVM引数
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
を使用してアプリケーションを実行します。
エージェント・ライブ構成: JMCエージェントを右クリックして、エージェント・ライブ構成コンソールを開きます。このページを使用すると、エージェントに適用されたグローバル構成を、イベント・リストやイベント詳細とともに表示できます。
JMCエージェント・プリセット・マネージャ: プリセット・マネージャは、構成テンプレートの作成、編集、変更に便利です。「Windows」をクリックし、JMCエージェント・プリセット・マネージャを選択します。必要なオプションのみを指定してxmlファイルを追加することや、ファイルの編集、ファイルをインポートして構成を管理することが可能です。
JMCエージェント・プラグイン
JMCエージェント・プラグインは、JDK Mission ControlにJMCエージェント機能を統合します。このプラグインを使用してJMCエージェントを起動し、JMX API経由でローカルのJVMに接続できます。
JOverflowのツリーマップ・ビューア
ツリーマップは、クラス別にメモリー使用量を視覚化するために使用されます。これは、多くのRAM (メモリー)を消費するリソースを特定するために役立ちます。JOverflowインスタンス・ビューアと同様に、ツリーマップ・ビューアもJOverflowが提供するフィルタ機能を利用します。
JMCでJOverflowツリーマップ・ビューを有効にするには、メニュー項目「ウィンドウ」→「ビューの表示」→「その他」→JOverflow→JOverflowツリーマップの順に移動します。「開く」をクリックします。
次に、JOverflowツリーマップのサンプル・イメージを示します:
図1-6 JOverflowツリーマップ
四角形を使用したツリーマップが表示され、メモリー使用量がクラス名およびパッケージ名別に集計されます。面積が大きいほど、クラスまたはパッケージによって消費されるメモリーが多くなります。背景色は、様々なレベルのツリーマップ・ノードを示します。
SWTに変換されたCoherence Tab Packプラグイン
Coherence Tab Packプラグインは、クラスタ情報および集計されたCoherence MBeansの表示に使用します。CoherenceプラグインがStandard Widget Toolkit (SWT)に変換され、JDK 11およびJavaFXとの依存関係がなくなりました。
プラグインをインストールするプロセスは、「JMCスタンドアロン・アプリケーションのプラグインのインストール」を参照してください。
Coherence Tab Packプラグインは、次のタブで構成されています:
- クラスタ概要: クラスタの全体的なヘルスに関する様々なメトリックが表示されます
- マシン: コア、負荷、メモリー不足など、すべてのクラスタ・マシンに関する情報を提供します
- メンバー: 個々のメンバーに関する詳細が表示されます
- サービス: 実行中のサービスおよび様々なパフォーマンス・メトリックに関する情報を提供します
- キャッシュ: 個々のキャッシュとそのサイズ、メモリー・フットプリントおよび個々のノードの詳細がリストされます
- プロキシ・サーバー: プロキシ・サーバーおよび接続が表示されます
- 永続性: アクティブまたはオンデマンドの永続性に関する情報を提供します
LZ4圧縮記録のサポート
JMC 8では、LZ4形式を使用して圧縮されたJFR記録の操作がサポートされるようになりました。LZ4は非常に高速なデコーダで、コア当たりの圧縮速度は500MB/秒を超え、マルチコアCPUによるスケールが可能です。
zip
またはgzipped
形式でJFR記録を圧縮できます。file
ユーティリティを使用して、ファイル・タイプを確認できます。LZ4ユーティリティを使用してデータ(.jfr)ファイルを圧縮するか、compress=true
を使用してレコードを圧縮します。
JRF記録を圧縮するコード例:
$ lz4 <un_compressed_filename>.jfr <compressed_filename>.jfr
Output: Compressed 8182601 bytes into 3626010 bytes ==> 44.31%
スレッド・グラフの改善
スレッド・グラフは次のものにより強化されています:
- 表示可能な範囲の開始時間と終了時間を表示する時間フィルタ
- ズーム・インおよびズーム・アウト機能
- ズームしてチャートの強調表示された領域を自動的に選択
- チャート・キャンバスの垂直および水平スクロール
「メモリー」および「TLAB」ページに追加された割当てプレッシャ列
「メモリー」ページに新しい列が追加され、割当て合計がパーセンテージ値として表示されます(割当て合計(%))。
既存の「スレッド別」タブに加えて、新しいタブ上位メソッド別が「TLAB割当て」 (スレッド・ローカル割当てバッファ)ページに追加され、上位メソッドに対してアイテム・ヒストグラムを分類できるようになりました。両方のタブにTLABに割当て(%)列とTLAB外に割当て(%)列があり、TLABの推定割当てサイズがパーセンテージとして表示されるようになりました。これらの更新により、割当てプレッシャに関連する領域の表示が容易になります。