Red Hat build of OpenJDK での JDK Flight Recorder の使用
概要
多様性を受け入れるオープンソースの強化
Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、Red Hat CTO である Chris Wright のメッセージ を参照してください。
Red Hat ドキュメントへのフィードバック (英語のみ)
Red Hat ドキュメントに関するご意見やご感想をお寄せください。フィードバックをお寄せいただくには、ドキュメントのテキストを強調表示し、コメントを追加できます。
このセクションでは、フィードバックの送信方法を説明します。
前提条件
- Red Hat カスタマーポータルにログインしている。
- Red Hat カスタマーポータルで、マルチページ HTML 形式でドキュメントを表示している。
手順
フィードバックを提供するには、以下の手順を実施します。
ドキュメントの右上隅にある Feedback ボタンをクリックして、既存のフィードバックを確認します。
注記フィードバック機能は、Multi-page HTML 形式でのみ有効です。
- フィードバックを提供するドキュメントのセクションを強調表示します。
強調表示されたテキスト近くに表示される Add Feedback ポップアップをクリックします。
ページの右側のフィードバックセクションにテキストボックスが表示されます。
テキストボックスにフィードバックを入力し、Submit をクリックします。
ドキュメントに関する問題が作成されます。
- 問題を表示するには、フィードバックビューで問題トラッカーリンクをクリックします。
第1章 JDK Flight Recorder の概要
JDK フライトレコーダー (JFR) は、Java アプリケーションを監視およびプロファイリングするためのオーバーヘッドの少ないフレームワークです。詳細は、JEP 328: Flight Recorder を参照してください。
JVM およびアプリケーションコード内のイベントからデータを収集することができます。その後、データはメモリーに書き込まれます。初めに、ディスク上の JFR
ファイル (*.jfr) にフラッシュする前に、スレッドローカルバッファーをスレッドローカルバッファーにプロモートし、固定サイズのグローバルリングバッファーにプロモートします。他のアプリケーションはこれらのファイルを分析に使用できます。たとえば、JDK Mission Control
(JMC) ツールです。
1.1. JDK Flight Recorder (JFR) コンポーネント
JFR 機能を使用して、JVM 内で実行されるイベントを監視し、これらの監視されたイベントから収集されたデータから記録を作成できます。
次のリストは、主要な JFR 機能の詳細です。
- 記録
- システムの記録を管理できます。各記録には固有の設定があります。録画を開始または停止したり、オンデマンドでディスクに保存したりできます。
- イベント
イベントまたはカスタムイベントを使用して Java アプリケーションのデータとメタデータをトレースし、いずれかのイベントタイプのデータとメタデータを JFR ファイルに保存できます。Java Mission Control (JMC)、
jcmd
などのさまざまなツールを使用して、JFR ファイルに格納されている情報を表示および分析できます。Java Virtual Machine (JVM) には、継続的に追加された既存のイベントが多数含まれています。ユーザーがカスタムイベントをアプリケーションに注入するために API を使用できます。
イベント設定を指定してオーバーヘッドを最小限に抑える場合は、記録時にイベントを有効または無効にできます。これらの設定は
xml
ドキュメントの形式を取り、JFR プロファイル (*.jfc
) と呼ばれます。Red Hat build of OpenJDK には、最も一般的なユースケースでは以下の 2 つのプロファイルがあります。-
default
: デフォルト のプロファイルは、実稼働環境で継続的に使用する場合に安全な低オーバーヘッド設定です。通常、オーバーヘッドは 1% 未満です。 -
profile
: プロファイルプロファイル は、プロファイリングに適する低オーバーヘッド設定です。通常、オーバーヘッドは 2% 未満です。
-
1.2. JDK フライトレコーダーを使用する利点
JDK Flight Recorder (JFR) を使用する主な利点には、以下が含まれます。
- JFR は実行中の JVM で記録できます。アプリケーションの再起動または再ビルドが難しい本番環境では、JFR を使用する方が適しています。
- JFR では、カスタムイベントとメトリックの定義を監視することができます。
- JFR は JVM に組み込まれ、パフォーマンスのオーバーヘッドを最小限に抑えることができます (約 1%)。
- JFR は、一貫したデータモデルを使用して、イベントの境界およびデータのフィルタリングを向上させます。
- JFR を使用すると、API を使用したサードパーティーのアプリケーションの監視が可能になります。
JFR は、以下を行います。
- 時間を費やす。
- 問題のトラブルシューティングに役立ちます。
JFR は、以下の操作コストとビジネス中断を削減します。
- 解決時間を短縮する時間を提供します。
- パフォーマンスの問題を特定し、システム効率を向上するのに役立ちます。
第2章 JDK Mission Control の概要
JDK Mission Control (JMC) は、Java Flight Recorder (JFR) ファイルの読み取りおよび分析を行うツールのコレクションです。これには、JMC イベントを出力する詳細ビューおよびグラフが含まれます。JFR 分析では、JMC も以下のコンポーネントで設定されます。
- JMX Console MBean
-
フライト記録と
hprof
ファイルによる履歴分析 (JMC 7.1.0 より) - HPROF-dump analyzer
JMC は Eclipse プラットフォームに基づいています。Eclipse RCP API およびその他の特定の API を使用してプラグインを追加することで JMC を拡張できます。
JMC とそのプラグインは、いずれかの Red Hat Enterprise Linux で使用できます。 RHEL または Microsoft Windows。
Red Hat Enterprise Linux では、RHEL 9 の CodeReady Linux Builder (CRB) リポジトリーが JMC パッケージを提供します。
CRB リポジトリーは、Builder リポジトリーとも呼ばれます。
RHEL に JMC をインストールできるように、RHEL 9 で CRB リポジトリーを有効にする必要があります。CRB パッケージは製品化された RHEL パッケージとして Source Red Hat Package Manager (SRPM) でビルドされるため、CRB パッケージは定期的に更新を受け取ります。
CRB は、RHEL ではデフォルトで無効になっている開発者リポジトリーです。CRB には、RHEL ユーザーアカウントに提供される buildroot
ルートファイルシステムの一部が含まれています。buildroot
ルートファイルシステムには、アプリケーションをビルドするための開発者レベルのビルド依存関係が含まれています。
CRB リポジトリーの詳細は、CodeReady Linux Builder リポジトリー (パッケージマニフェスト) を参照してください。
2.1. JMC のダウンロードとインストール
Red Hat Enterprise Linux および Microsoft Windows 用の Red Hat ビルドの OpenJDK ディストリビューションには、JMC のバージョンが含まれています。
Red Hat Enterprise Linux の場合、Red Hat Subscription Manager ツールを使用して、ローカルのオペレーティングシステムに JMC をダウンロードしてインストールできます。
Microsoft Windows の場合、Red Hat カスタマーポータルからダウンロードできるアーカイブファイルに JMC パッケージが まれています。Microsoft Windows に Red Hat build of OpenJDK 17 をダウンロードしてインストールしたら、jmc.exe
ファイルが含まれるディレクトリーに移動して、jmc
コマンドを実行できます。
2.1.1. RHEL 9 での JMC のダウンロードとインストール
Red Hat Subscription Management (RHSM) ツールを使用して、JDK Mission Control (JMC) をローカルの Red Hat Enterprise Linux (RHEL) 9 オペレーティングシステムにダウンロードしてインストールできます。
前提条件
- RHEL に Red Hat build of OpenJDK 17.0.8 をダウンロードしてインストールしている。
- オペレーティングシステムに root ユーザーとしてログインしている。
- Red Hat カスタマーポータル でアカウントを登録している。
- Red Hat build of OpenJDK 17 リポジトリーにアクセスするためのアクティブなサブスクリプションがある RHSM アカウントを登録している。システムを RHSM アカウントに登録する方法は、Red Hat Subscription Management を使用したシステムの登録 (Red Hat Subscription Management の使用) を参照してください。
手順
RHEL で CodeReady Linux Builder (CRB) リポジトリーを有効にして、ダウンロードした JMC パッケージを RHEL にインストールできるようにします。次のアクションを完了することで、CRB リポジトリーを有効にできます。
RHEL で CRB リポジトリーを有効にするには、次の RHSM コマンドを実行します。
# subscription-manager repos --enable codeready-builder-for-rhel-9-x86_64-rpms
CRB リポジトリー内のモジュールのリストを確認するには、次のコマンドを実行します。
# yum module list --disablerepo=* --enablerepo=codeready-builder-for-rhel-9-x86_64-rpms
次の出力例は、リポジトリーの
共通
プロファイルで定義されているjavapackages-tools
モジュールを示しています。# yum module list --disablerepo=* --enablerepo=codeready-builder-for-rhel-9-x86_64-rpms Updating Subscription Management repositories. Last metadata expiration check: 0:40:08 ago on Tue 02 May 2023 08:49:29 AM EDT. Red Hat CodeReady Linux Builder for RHEL 9 x86_64 (RPMs) Name Stream Profiles Summary javapackages-tools 201801 common Tools and macros for Java packaging support virt-devel rhel Virtualization module Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
前の例は、どのプロファイルにも割り当てられていない
virt-devel
モジュールも示しています。ターゲットパッケージをインストールします。たとえば、
xz-java
というパッケージをインストールするには、次のコマンドを発行し、CLI コマンドプロンプトに従っていることを確認します。# yum install xz-java
以下のいずれかのオプションを選択し、オペレーティングシステムで JMC コンソールを起動します。
JMC 実行可能ファイルが含まれるディレクトリーに移動して、以下のコマンドを実行します。
$ jmc -vm /usr/lib/jvm/java-11/bin/java
-
システムのファイルエクスプローラーアプリケーションを使用して、
/usr/bin/jmc
などの JDK Mission Control ディレクトリーに移動し、JMC 実行可能ファイルをダブルクリックします。
2.1.2. RHEL 7 または RHEL 8 への JMC のダウンロードとインストール
Red Hat Subscription Manager (RHSM) ツールを使用して、JDK Mission Control (JMC) をローカルの Red Hat Enterprise Linux (RHEL) 7 または 8 オペレーティングシステムにダウンロードしてインストールできます。
前提条件
- RHEL のバージョン(RHEL 7 または RHEL 8)に Red Hat ビルドの OpenJDK 11.0.20 をダウンロードしてインストールしている。
- オペレーティングシステムに root ユーザーとしてログインしている。
- Red Hat カスタマーポータル でアカウントを登録している。
- Red Hat build of OpenJDK 17 リポジトリーにアクセスするためのアクティブなサブスクリプションがある RHSM アカウントを登録している。システムを RHSM アカウントに登録する方法は、Red Hat Subscription Manager を使用したシステムの登録 (Red Hat Subscription Management の使用) を参照してください。
手順
ご使用のバージョンの RHEL に JMC パッケージをダウンロードするには、次のコマンドを実行します。
RHEL 8 の場合:
# sudo yum module install jmc:rhel8/common
RHEL 7 の場合:
# sudo yum module install jmc:rhel7/common
上記のコマンドは、Red Hat Subscription Management ツールを使用して JMC パッケージを RHEL オペレーティングシステムにダウンロードします。この JMC パッケージは、Red Hat Subscription Management サービスの
jmc
モジュールストリームにあります。
オペレーティングシステムで JMC コンソールを起動するには、次のいずれかのオプションを完了します。
JMC 実行可能ファイルが含まれるディレクトリーに移動して、以下のコマンドを実行します。
$ jmc -vm /usr/lib/jvm/java-11/bin/java
-
システムのファイルエクスプローラーアプリケーションを使用して、
/usr/bin/jmc
などの JDK Mission Control ディレクトリーに移動し、JMC 実行可能ファイルをダブルクリックします。
2.2. JDK Mission Control (JMC) Agent
JMC Agent を使用して、実行中のアプリケーションに JDK Flight Recorder (JFR) 機能を追加できます。JMC Agent を使用して、実行中の Java 仮想マシン (JVM) にカスタムフライトレコーダーイベントを追加することもできます。
JMC Agent には、以下の機能が含まれます。
- JFR テンプレートを使用している際の生成済みイベントの有効化/無効化に対する高い制御。
-
効率的な
Timestamp
クラス使用時のタイムスタンプキャプチャー。 - フライトレコードィング生成時の低メモリー消費。
Red Hat Enterprise Linux および Microsoft Windows 用の Red Hat build of OpenJDK 17.0.8 インストールファイルには、JMC パッケージに JMC エージェントが含まれません。JMC Agent のサードパーティーバージョンをダウンロードしてインストールしてから、選択したプラットフォームで Red Hat build of OpenJDK の JMC パッケージとの互換性を確認する必要があります。
JMC Agent などのサードパーティーアプリケーションは、Red Hat ではサポートされていません。Red Hat 製品とサードパーティーのアプリケーションを併用するには、ダウンロードしたソフトウェアのセキュリティーおよび信頼性をテストするようにしてください。
JMC Agent のグラフィカルユーザーインターフェイス (GUI) は、Red Hat Enterprise Linux と Microsoft Windows の両方でも同様に表示されます。ただし、いずれかのプラットフォームに固有の Java の Standard Widget Toolkit (SWT) で導入されたグラフィカル変更を除きます。
JMC Agent をビルドし、JMC Agent JAR ファイルがある場合は、JMC コンソールの JVM Browser パネルで JMC Agent プラグインにアクセスできます。このプラグインを使用すると、JMC Agent の設定や JMC Agent と JFR データの対話方法の管理など、JMC コンソールで JMC Agent 機能を使用できます。
関連情報
- Red Hat OpenJDK ビルドで利用可能な JMC パッケージの詳細は、Downloading and installing JDK Mission Control (JMC) を参照してください。
2.3. JDK Mission Control (JMC) Agent の起動
JMC Agent プラグインを使用して JMC Agent を起動できます。Red Hat Enterprise Linux および Microsoft Windows は、このプラグインの使用をサポートしています。
JMC エージェントを起動すると、エージェントを設定したり、エージェントが JFR データと対話する方法を管理できます。
前提条件
-
Red Hat Enterprise Linux または Microsoft Windows のいずれかに
jmc
パッケージをダウンロードしてインストールしている。 - Adoptium Agent JAR ファイルをダウンロードしている。adoptium/jmc-build (GitHub) を参照してください。
-
--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED
フラグを使用して、Java アプリケーションを起動している。./<your_application> --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED
はその例です。
Adoptium はコミュニティーがサポートするプロジェクトです。Adoptium の agent.jar
の使用は、Red Hat 実稼働環境におけるサービスレベルアグリーメント (SLA) の対象外です。
手順
オペレーティングシステムに応じて、以下のいずれかの方法を選択して JMC コンソールを起動します。
-
Red Hat Enterprise Linux で、実行可能ファイルが含まれるディレクトリーに移動し、
./jmc
コマンドを実行します。 Microsoft Windows で、
jmc.exe
ファイルが含まれるディレクトリーに移動し、jmc
コマンドを実行します。注記システムのファイルエクスプローラーアプリケーションを使用して、いずれかのオペレーティングシステムで JMC アプリケーションを起動し、JDK Mission Control ディレクトリーに移動してから JMC 実行可能ファイルをダブルクリックします。
-
Red Hat Enterprise Linux で、実行可能ファイルが含まれるディレクトリーに移動し、
- JVM Browser ナビゲーションパネルに移動します。このパネルで、利用可能な JVM 接続を表示できます。
-
JVM Browser パネルで、
[11.0.13] The JVM Running Mission Control
などのターゲット JVM インスタンスをデプロイメントします。対象の JVM インスタンスの下にアイテムリストが表示されます。 ナビゲーションパネルで JMC Agent アイテムをダブルクリックします。JMC コンソールで、Start JMC Agent ウィンドウが開きます。
図2.1 JMC Agent ウィンドウの起動
Browse ボタンを使用して、JMC Agent の JAR ファイルを Agent JAR フィールドに追加します。Agent XML フィールドはオプションです。
注記JMC は選択したターゲット JVM インスタンスに基づいて値を自動的に追加するため、Target JVM フィールドに値を入力する必要はありません。
Start ボタンをクリックします。
JMC は、JVM Browser navigation パネルで、ターゲット JVM インスタンスの下に Agent Plugin アイテムを追加します。JMC コンソールが自動的に Agent Live Config ペインを開きます。
図2.2 Agent Live Config ペイン
JMC Agent の設定や、JMC Agent と JFR データ間の対話の管理が可能になりました。XML 設定を生成して JMC コンソールにアップロードすると、Agent Live Config ペインにその XML ファイルに関連付けられたメタデータが表示されます。
図2.3 JMC コンソールに追加された XML 設定ファイルの例
2.4. JMC Agent を使用した事前設定の作成
JMC コンソールで JMC Agent インスタンスを設定できます。
JMC コンソールは、以下の JMC Agent 設定オプションを提供します。以下はその例です。
- Agent Preset Manager オプションを使用して、カスタマイズされた事前設定を作成します。
- XML 設定を JMC Agent の事前設定にインポートします。
-
defineEventProbes
関数を使用して、カスタム JFR イベントの XML 記述を追加します。 - アクティブなカスタム JFR イベントを事前設定として保存し、後でそれらを取得できます。
前提条件
- JMC コンソールで JMC Agent インスタンスを起動している。
手順
- メニューバーから Window をクリックし、JMC Agent Preset Manager メニュー項目をクリックすると、新しい事前設定を作成できます。JMC コンソールで JMC Agent Configuration Preset Manager ウィザードが開きます。
Add ボタンをクリックして、Edit Preset Global Configurations ウィンドウにアクセスします。
図2.4 Edit Preset Global Configurations ウィンドウ
このウィンドウで、事前に設定した名前を入力できます。オプションで、ターゲット JVM に挿入するイベントのクラス接頭辞を入力できます。AllowtoString チェックボックスと Allow Converter チェックボックスも選択できます。
Next ボタンをクリックします。Add or Remove Preset Events ウィンドウが開きます。このウィンドウから、事前設定した新規イベントの追加、編集、削除を行うことができます。
図2.5 事前設定イベントの追加または削除
ウィザードの手順に従い、以下を実行できます。
- イベント設定の編集
- パラメーターまたは戻り値手順の編集
パラメーターまたは戻り値取得の編集
ヒント各ウィザード手順で利用可能なボタンのいずれかを選択し、Add、Remove など、希望の設定を完了できます。任意の段階で Back ボタンをクリックして、直前のウィザードステップを編集できます。
- Finish ボタンをクリックして Add または Remove Preset Events ウィンドウに戻ります。
- Next をクリックします。Preview Preset Output ウィンドウが開きます。
生成された XML データを確認してから Finish ボタンをクリックします。
図2.6 事前設定出力のプレビュー
- JMC コンソールウィンドウの右上にある Load Preset ボタンをクリックし、事前設定を JMC アプリケーションにアップロードします。
JMC Agent Configuration Preset Manager ウィンドウで、OK ボタンをクリックしてターゲット JVM に事前設定を読み込みます。JMC コンソールの Agent Live Present パネルには、アクティブなエージェント設定と、挿入されたイベントが表示されます。以下に例を示します。
図2.7 Agent Live Present ペインの出力例
関連情報
- JMC XML 属性の詳細は、JMC Agent Plugin attributes を参照してください。
2.5. JMC Agent プラグイン属性
JMC コンソールは、ボタン、ドロップダウンリスト、テキストフィールドなどの形式で多くの属性をサポートします。特定の JMC Agent 属性を使用してエージェントを設定できます。
以下の表は、JMC Agent の設定に使用できる属性のカテゴリーの概要を示しており、Agent を使用してニーズに合わせて JFR データを監視できます。
表2.1 JMC Agent で使用する設定属性のリスト。
属性 | 説明 |
---|---|
| JMC Agent がコンバーターを使用できるかどうかを決定します。コンバーターを有効にすると、カスタムデータタイプまたはオブジェクトを JFR コンテンツタイプに変換できます。JFR は、これらのタイプをカスタムイベントと共に記録できます。 |
| JMC Agent が配列とオブジェクトパラメーターを文字列として記録できるかどうかを決定します。
注記: |
|
挿入されたイベントの接頭辞接頭辞を決定します。例: |
| JMC Agent の設定オプションが含まれます。 |
|
イベント定義を開始します。 |
表2.2 JMC Agent で使用するイベントタイプ属性のリスト。
属性 | 説明 |
---|---|
| メソッドからイベントタイプを受け取るクラスを定義します。 |
| イベントタイプを記述します。 |
| エージェントが定義済みメソッドに挿入するイベントセットをリスト表示します。イベントタグには ID が必要です。JFR は、カスタムイベントのイベントタグを使用します。 |
| イベントタイプの名前を定義します。 |
|
挿入されたイベントを受信するメソッドの場所を決定します。たとえば、 |
| カスタムイベントを保存する場所を指すパス。このパスは、JMC コンソールのJVM Browser ナビゲーションパネルにリスト表示されているイベントに関連します。 |
|
挿入されたイベントを受信するメソッドを定義します。
|
| イベントタイプがスタックトレースを記録するかどうかを決定します。 |
表2.4 JMC Agent で使用するフィールドキャプチャー属性のリスト。
属性 | 説明 |
---|---|
| 取得するフィールドの記述。 |
| エージェントが分析して定義済みフィールドを見つける式を定義します。 |
| JMC Agent が定義済みイベントタイプでキャプチャーおよび出力するクラスフィールド値を決定します。 |
| クラスフィールドキャプチャー属性の名前。 |
第3章 JDK Flight Recorder の起動
3.1. JVM の起動時に JDK Flight Recorder の起動
Java プロセスの開始時に、JDK Flight Recorder (JFR) を開始できます。JFR の動作を変更するには、オプションのパラメーターを追加します。
手順
--XX
オプションを使用してjava
コマンドを実行します。$
java -XX:StartFlightRecording Demo
Demo は、Java アプリケーションの名前に置き換えます。
JFR は Java アプリケーションから始まります。
例
以下のコマンドでは、Java プロセス (Demo) を開始し、1 時間の長さのフライトレコーの録画を開始して、demorecording.jfr
という名前のファイルに保存されます。
$
java -XX:StartFlightRecording=duration=1h,filename=demorecording.jfr Demo
関連情報
- JFR オプションの詳細なリストは、Java tools reference を参照してください。
3.2. 実行中の JVM での JDK Flight Recorder の開始
jcmd
ユーティリティーを使用して、診断コマンド要求を実行中の JVM に送信できます。jcmd
には、start
、dump
、stop
などの最も基本的なコマンドとともに、JFR との対話のコマンドが含まれます。
JVM と対話するには、jcmd
に JVM のプロセス ID (pid) が必要です。実行中の JVM プロセス ID のリストを表示する jcmd -l
コマンドと、プロセスの起動に使用したメインクラスやコマンドライン引数などの情報を表示することで取得できます。
jcmd
ユーティリティーは $JAVA_HOME/bin
にあります。
手順
以下のコマンドを使用して、フライトレコーディングを開始します。
$
jcmd <pid> JFR.start <options>
たとえば、以下のコマンドは
demorecording
という名前の録画を開始します。これは過去 4 時間のデータを保持し、サイズが 400 MB の録画になります。$
jcmd <pid> JFR.start name=demorecording maxage=4h maxsize=400MB
関連情報
-
jcmd
オプションの詳細なリストは、jcmd ツールのリファレンス を参照してください。
3.3. JDK Mission Control アプリケーションの使用による JVM での JDK Flight Recorder の開始
JDK Mission Control
(JMC) アプリケーションにはフライトレコーダーがあります。これにより、フライトレコーティングを開始および設定できるシンプルな操作が可能になります。
手順
JVM ブラウザーを開きます。
$
JAVA_HOME/bin/jmc
JVM ブラウザービューで JVM を右クリックし、
Start Flight Recording
を選択します。フライトレコーウィザードが開きます。
図3.1 JMC JFR ウィザード
JDK Flight Recording Wizard には 3 つのページがあります。
ウィザードの最初のページには、以下を含む移動記録の一般的な設定が含まれています。
- 記録の名前
- 記録の保存先のパスおよびファイル名
- 録画が固定された時間または継続的な録画であるか。イベントテンプレートが使用されます。
- 録画の説明
- 2 番目のページには、フライトレコーのイベントオプションが含まれます。Garbage Collections、Memory Profiling、および Method Sampling およびその他のイベントレコードの詳細レベルを設定できます。
- 3 番目のページには、イベントの詳細の設定が含まれます。イベントをオンにまたはオフにし、スタックトレースの記録を有効にし、イベントの記録に必要な時間しきい値を変更できます。
- 記録の設定を編集します。
Finish
をクリックします。ウィザードは終了し、移動の記録が開始されます。
3.4. カスタムイベント API の定義と使用
JDK Flight Recorder (JFR) は、カスタムイベント API を含むイベントレコーダーです。jdk.jfr
モジュールに格納されているカスタムイベント API は、アプリケーションが JFR と通信できるようにするソフトウェアインターフェイスです。
JFR API には、Java アプリケーション、JVM、またはオペレーティングシステムの記録を管理し、カスタムイベントを作成するために使用できるクラスが含まれています。
カスタムイベント API を使用してイベントをモニターする前に、カスタムイベントタイプの名前とメタデータを定義する必要があります。
Event
クラスを拡張することにより、Duration
、Instant
、Requestable
、Time event
などの JFR ベースイベントを定義できます。具体的には、期間の値などのフィールドを、アプリケーションのペイロード属性で定義されたデータ型に一致するクラスに追加できます。Event
クラスを定義した後、イベントオブジェクトを作成できます。
この手順では、JFR および JDK Mission Control (JMC) でカスタムイベントタイプを使用して、単純なサンプルプログラムの実行時パフォーマンスを分析する方法を示します。
手順
カスタムイベントタイプの
Event
クラスで、@name
アノテーションを使用してカスタムイベントに名前を付けます。この名前は、JMC グラフィカルユーザーインターフェイス (GUI) に表示されます。Event
クラスでカスタムイベントタイプ名を定義する例@Name(“SampleCustomEvent”) public class SampleCustomEvent extends Event {...}
Event
クラスのメタデータと、名前、カテゴリー、ラベルなどの属性を定義します。ラベルには、JMC などのクライアントのイベントタイプが表示されます。注記大きな記録ファイルはパフォーマンスの問題を引き起こす可能性があり、これはファイルの操作方法に影響を与える可能性があります。必要なイベント記録アノテーションの数を正しく定義していることを確認してください。不要なアノテーションを定義すると、記録ファイルのサイズが大きくなる可能性があります。
サンプルの
Event
クラスのアノテーションを定義する例@Name(“SampleCustomEvent”) 1 @Label("Sample Custom Event") @Category("Sample events") @Description("Custom Event to demonstrate the Custom Events API") @StackTrace(false) 2 public class SampleCustomEvent extends Event { @Label("Method") 3 public String method; @Label("Generated Number") public int number; @Label("Size") @DataAmount 4 public int size; }
- 1
- JMC GUI でのカスタムイベントの表示方法のメタデータを定義する
@Name
などのアノテーションを記述します。 - 2
@StackTrace
アノテーションは、フライト記録のサイズを増やします。デフォルトでは、JFR にはイベントが作成された場所のstackTrace
は含まれていません。- 3
@Label
アノテーションは、HTTP リクエストのリソースメソッドなど、各メソッドのパラメーターを定義します。- 4
@DataAmount
アノテーションには、データ量をバイト単位で定義する属性が含まれています。JMC は、データ量をメガバイト (MB) などの他の単位で自動的にレンダリングします。
Event
クラスでコンテキスト情報を定義します。この情報は、カスタムイベントタイプの要求処理動作を設定するため、特定の JFR データを収集するようにイベントタイプを指定します。単純な
main
クラスとイベントループの定義例public class Main { private static int requestsSent; public static void main(String[] args) { // Register the custom event FlightRecorder.register(SampleCustomEvent.class); // Do some work to generate the events while (requestsSent <= 1000) { try { eventLoopBody(); Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } } } private static void eventLoopBody() { // Create and begin the event SampleCustomEvent event = new SampleCustomEvent(); event.begin(); // Generate some data for the event Random r = new Random(); int someData = r.nextInt(1000000); // Set the event fields event.method = "eventLoopBody"; event.number = someData; event.size = 4; // End the event event.end(); event.commit(); requestsSent++; }
前の例では、単純な
main
クラスがイベントを登録し、イベントループがイベントフィールドにデータを入力してから、カスタムイベントを発生させます。JMC や JFR ツールなど、選択したアプリケーションのイベントタイプを調べます。
図3.2 JMC でイベントタイプを調べる例
JFR 記録には、さまざまなイベントタイプを含めることができます。アプリケーションで各イベントタイプを調べることができます。
関連情報
- JMC の詳細については、Introduction to JDK Mission Control を参照してください。
第4章 JDK Flight Recorder の設定オプション
コマンドラインまたは診断コマンドを使用して、JDK Flight Recorder (JFR) を設定して、さまざまなイベントセットをキャプチャーできます。
4.1. コマンドラインを使用した JDK Flight Recorder の設定
以下のオプションを使用すると、コマンドラインから JDK Flight Recorder (JFR) を設定できます。
4.1.1. JFR の起動
-XX:StartFlightRecording
オプションを使用して、Java アプリケーションの JFR の録画を開始します。以下に例を示します。
java -XX:StartFlightRecording=delay=5s,disk=false,dumponexit=true,duration=60s,filename=myrecording.jfr <<YOUR_JAVA_APPLICATION>>
JFR 録画の開始時に、以下の parameter=value
エントリーを設定できます。
- delay=time
- このパラメーターを使用して、Java アプリケーションの起動時間から録画の開始までの遅延を指定します。時間で (秒の場合は s)、分 (分の場合は m)、h (日の場合は d) を指定する場合には s を追加します。たとえば、10m を指定すると 10 分になります。デフォルトでは遅延がなく、このパラメーターは 0 に設定されます。
- disk={true|false}
-
このパラメーターを使用して、録画中にディスクにデータを書き込むかどうかを指定します。デフォルトでは、このパラメーターは
true
です。 - dumponexit={true|false}
-
このパラメーターを使用して、JVM シャットダウン時に実行中の録画がダンプされるかどうかを指定します。パラメーターが有効になり、ファイル名が設定されていない場合、録画の進捗は、録画の進捗が開始されたディレクトリー内のファイルに記録が書き込まれます。ファイル名は、プロセス ID、記録 ID、および現在のタイムスタンプを含むシステム生成名です。例: hotspot-pid-47496-id-1-2018_01_25_19_10_41.jfrデフォルトでは、このパラメーターは
false
です。 - duration=time
- このパラメーターを使用して、記録期間を指定します。時間で (秒の場合は s)、分 (分の場合は m)、h (日の場合は d) を指定する場合には s を追加します。たとえば、期間を 5h に指定した場合は、5 時間を示します。デフォルトでは、このパラメーターは 0 に設定されています。これは、録画期間に無制限を意味します。
- filename=path
このパラメーターを使用して、録画ファイルのパスと名前を指定します。停止時にこのファイルに記録が書き込まれます。以下に例を示します。
IncomeSource recording.jfr
· /home/user/recordings/recording.jfr
- name=identifier
- このパラメーターを使用して、記録の名前と録画の識別子を指定します。
- maxage=time
- このパラメーターを使用して、ディスク上で録画可能な最大日数を指定します。このパラメーターは、disk パラメーターが true に設定されている場合にのみ有効です。時間で (秒の場合は s)、分 (分の場合は m)、h (日の場合は d) を指定する場合には s を追加します。たとえば、30s を指定する場合、これは 30 秒を示します。デフォルトでは、このパラメーターは 0 に設定されています。これは、制限が設定されていないことを意味します。
- maxsize=size
-
このパラメーターを使用して、録画用に保持するディスクデータの最大サイズを指定します。このパラメーターは、disk パラメーターが true に設定されている場合にのみ有効です。この値は、
-XX:FlightRecorderOptions
で設定したmaxchunksize
パラメーターの値よりも小さくすることはできません。サイズをメガバイト単位で指定する場合は m または M を追加するか、サイズがギガバイトで指定する g または G を指定します。デフォルトでは、ディスクデータの最大サイズは制限されず、このパラメーターは 0 に設定されます。 - path-to-gc-roots={true|false}
このパラメーターを使用して、録画の最後でガベッジコレクション (GC) ルートへのパスを収集するかどうかを指定します。デフォルトでは、このパラメーターは false に設定されます。
GC ルートへのパスは、メモリーリークを見つけるのに便利です。Red Hat build of OpenJDK 17 では、ヒープダンプの使用よりも効率的であり、古い
ObjectSample
イベントを有効にできます。実稼働環境でOldObjectSample
イベントを使用することもできます。メモリーリーク情報の収集には時間がかかり、追加のオーバーヘッドが発生します。このパラメーターは、メモリーリークがあるアプリケーションの録画を開始する場合にのみ有効にする必要があります。JFR プロファイルパラメーターがプロファイルに設定されている場合、オブジェクトのリークが発生した場所からスタックを追跡できます。収集された情報に含まれます。- settings=path
- このパラメーターを使用して、イベント設定ファイルのパスおよび名前を指定します (JFC のタイプは JFC)。デフォルトでは、JAVA_HOME/lib/jfr にある default.jfc ファイルが使用されます。このデフォルト設定ファイルはオーバーヘッドが低い事前定義の情報を収集するため、パフォーマンスへの影響が最小限であり、継続して実行される記録に使用できます。2 番目の設定ファイルも提供されています。profile.jfc はデフォルト設定よりも多くのデータを提供しますが、オーバーヘッドが増え、パフォーマンスに影響を与える可能性があります。詳細情報が必要な場合に短い期間にこの設定を使用します。
複数のパラメーターの値をコンマで区切ります。例: -XX:StartFlightRecording=disk=false
、name=example-recording
4.1.2. JFR の動作の制御
-XX:FlightRecorderOptions
オプションを使用して、JFR の動作を制御するパラメーターを設定します。以下に例を示します。
java -XX:FlightRecorderOptions=duration=60s,filename=myrecording.jfr -XX:FlightRecorderOptions=stackdepth=128,maxchunksize=2M <<YOUR_JAVA_APPLICATION>>
以下の parameter=value
エントリーを設定して、JFR の動作を制御できます。
- globalbuffersize=size
-
このパラメーターを使用して、データの保持に使用するプライマリーメモリーの合計量を指定します。デフォルト値は、
memorysize
に指定された値に基づいています。memorysize
パラメーターを変更して、グローバルバッファーのサイズを変更できます。 - maxchunksize=size
- このパラメーターを使用して、データチャンクの最大サイズを指定します。サイズをメガバイト単位 (MB) で指定する場合は m または M を追加するか、サイズがギガバイト (GB) で指定する g または G を指定します。デフォルトでは、データチャンクの最大サイズは 12 MB に設定されています。許可される最小値は 1 MB です。
- memorysize=size
-
このパラメーターを使用して、使用するバッファーメモリー容量を決定します。このパラメーターは、指定したサイズに基づいて
globalbuffersize
パラメーターおよびnumglobalbuffers
パラメーターを設定します。サイズをメガバイト単位 (MB) で指定する場合は m または M を追加するか、サイズがギガバイト (GB) で指定する g または G を指定します。デフォルトでは、メモリーサイズは 10 MB に設定されています。 - numglobalbuffers=number
-
このパラメーターを使用して、使用されるグローバルバッファーの数を指定します。デフォルト値は、
memorysize
パラメーターで指定したサイズに基づいています。memorysize
パラメーターを変更して、グローバルバッファーの数を変更できます。 - old-object-queue-size=number-of-objects
- このパラメーターを使用して、古いオブジェクトの最大数を追跡します。デフォルトでは、オブジェクト数は 256 に設定されます。
- repository=path
- このパラメーターを使用して、一時ディスクストレージのリポジトリーを指定します。デフォルトでは、システムの一時ディレクトリーを使用します。
- retransform={true|false}
-
このパラメーターを使用して、JVMTI を使用してイベントクラスを再変換するかどうかを指定します。
false
に設定すると、読み込まれたイベントクラスにインストルメンテーションが追加されます。デフォルトでは、クラスの再変換を有効にするには、このパラメーターをtrue
に設定します。 - samplethreads={true|false}
-
このパラメーターを使用して、スレッドサンプリングを有効にするかどうかを指定します。スレッドサンプリングは、サンプリングイベントが有効で、このパラメーターが
true
に設定されている場合にのみ発生します。デフォルトでは、このパラメーターはtrue
に設定されます。 - stackdepth=depth
- このパラメーターを使用して、スタックトレースのスタック深度を設定します。デフォルトでは、スタックの深さは 64 メソッド呼び出しに設定されます。スタックの最大深さを 2048 に設定できます。64 を超える値は、大きなオーバーヘッドを作成し、パフォーマンスが低下する可能性があります。
- threadbuffersize=size
- このパラメーターを使用して、スレッドのローカルバッファーサイズを指定します。デフォルトでは、ローカルバッファーサイズは最低 4 キロバイトの 8 キロバイトに設定されます。このパラメーターを上書きすると、パフォーマンスが低下する可能性があるため、推奨されません。
複数のパラメーターの値をコンマで区切ります。
4.2. 診断コマンド (JCMD) を使用した JDK Flight Recorder の設定
Java 診断コマンドを使用して、JDK Flight Recorder (JFR) を設定できます。診断コマンドを実行する最も簡単な方法は、Java インストールディレクトリーにある jcmd
ツールを使用する方法です。このコマンドを使用するには、JVM のプロセス識別子またはメインクラスの name と、実際のコマンドを jcmd
への引数として渡す必要があります。引数なしで jcmd
を実行するか、jps
を使用して JVM またはメインクラスの名前を取得できます。jps
(Java Process Status) ツールは、アクセス権限のあるターゲットシステムの JVM をリスト表示します。
実行中の Java プロセスのリストを表示するには、引数を指定せずに jcmd
コマンドを使用します。実行中の Java アプリケーションで利用可能なコマンドの完全なリストを表示するには、プロセス ID またはメインクラスの名前の後に診断コマンドとして help を指定します。
JFR で以下の診断コマンドを使用します。
4.2.1. JFR の起動
JFR.start
diagnostic コマンドを使用して、フライトの録画を開始します。以下に例を示します。
jcmd <PID> JFR.start delay=10s duration=10m filename=recording.jfr
表4.1 以下の表には、このコマンドで使用できるパラメーターをまとめています。
パラメーター | 説明 | データ型 | デフォルト値 |
---|---|---|---|
name | 記録の名前 | 文字列 | - |
settings | サーバー側テンプレート | 文字列 | - |
duration | 記録期間 | 時間 | 0s |
filename | 生成される記録ファイル名 | 文字列 | - |
maxage | バッファーデータの最大期間 | 時間 | 0s |
maxsize | バッファーの最大サイズ (バイト単位) | ロング | 0 |
dumponexit | JVM シャットダウン時のダンプ実行の記録 | ブール値 | - |
path-to-gc-roots | ガベッジコレクタールートへの収集パス | ブール値 | False |
4.2.2. JFR の停止
JFR.stop
diagnostic コマンドを使用して、フライトレコーの録画を停止します。以下に例を示します。
jcmd <PID> JFR.stop name=output_file
表4.2 以下の表には、このコマンドで使用できるパラメーターをまとめています。
パラメーター | 説明 | データ型 | デフォルト値 |
---|---|---|---|
name | 記録の名前 | 文字列 | - |
filename | 録画データをファイルにコピーします。 | 文字列 | - |
4.2.3. JFR のチェック
JFR.check
コマンドを使用して、進行中の録画に関する情報を表示します。以下に例を示します。
jcmd <PID> JFR.check
表4.3 以下の表には、このコマンドで使用できるパラメーターをまとめています。
パラメーター | 説明 | データ型 | デフォルト値 |
---|---|---|---|
name | 記録の名前 | 文字列 | - |
filename | 録画データをファイルにコピーします。 | 文字列 | - |
maxage | ダンプファイルの最大サイズ | 時間 | 0s |
maxsize | ダンプする最大バイト数 | ロング | 0 |
begin | データのダンプ開始 | 文字列 | - |
end | データをダンプする終了時間 | 文字列 | - |
path-to-gc-roots | ガベッジコレクタールートへの収集パス | ブール値 | false |
4.2.4. JFR のダンプ
JFR.dump
diagnostic コマンドを使用して、フライト録画のコンテンツをファイルにコピーします。以下に例を示します。
jcmd <PID> JFR.dump name=output_file filename=output.jfr
表4.4 以下の表には、このコマンドで使用できるパラメーターをまとめています。
パラメーター | 説明 | データ型 | デフォルト値 |
---|---|---|---|
name | 記録の名前 | 文字列 | - |
filename | 録画データをファイルにコピーします。 | 文字列 | - |
maxage | ダンプファイルの最大サイズ | 時間 | 0s |
maxsize | ダンプする最大バイト数 | ロング | 0 |
begin | データのダンプ開始 | 文字列 | - |
end | データをダンプする終了時間 | 文字列 | - |
path-to-gc-roots | ガベッジコレクタールートへの収集パス | ブール値 | false |
4.2.5. JFR の設定
JFR.configure
diagnostic コマンドを使用して、フライトの録画を設定します。以下に例を示します。
jcmd <PID> JFR.configure repositorypath=/home/jfr/recordings
表4.5 以下の表には、このコマンドで使用できるパラメーターをまとめています。
パラメーター | 説明 | データ型 | デフォルト値 |
---|---|---|---|
repositorypath | リポジトリーのパス | 文字列 | - |
dumppath | ダンプのパス | 文字列 | - |
stackdepth | スタックの深さ | Jlong | 64 |
globalbuffercount | グローバルバッファーの数 | Jlong | 32 |
globalbuffersize | グローバルバッファーのサイズ | Jlong | 524288 |
thread_buffer_size | スレッドバッファーのサイズ | Jlong | 8192 |
memorysize | 全体的なメモリーサイズ | Jlong | 16777216 |
maxchunksize | 個々のディスクチャンクのサイズ | Jlong | 12582912 |
Samplethreads | スレッドサンプリングの有効化 | ブール値 | true |
改訂日時: 2023-09-20