Red Hat build of OpenJDK での JDK Flight Recorder の使用

Red Hat build of OpenJDK 11

Red Hat Customer Content Services

概要

Red Hat build of OpenJDK 17 は、Red Hat Enterprise Linux および Microsoft Windows 上の Red Hat 製品です。『Red Hat build of OpenJDK での JDK Flight Recorder の使用』 ガイドでは、JDK Flight Recorder (JFR) および JDK Mission Control (JMC) の概要と、JFR の起動方法を説明します。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、Red Hat CTO である Chris Wright のメッセージ を参照してください。

Red Hat ドキュメントへのフィードバック (英語のみ)

Red Hat ドキュメントに関するご意見やご感想をお寄せください。フィードバックをお寄せいただくには、ドキュメントのテキストを強調表示し、コメントを追加できます。

このセクションでは、フィードバックの送信方法を説明します。

前提条件

  • Red Hat カスタマーポータルにログインしている。
  • Red Hat カスタマーポータルで、マルチページ HTML 形式でドキュメントを表示している。

手順

フィードバックを提供するには、以下の手順を実施します。

  1. ドキュメントの右上隅にある Feedback ボタンをクリックして、既存のフィードバックを確認します。

    注記

    フィードバック機能は、Multi-page HTML 形式でのみ有効です。

  2. フィードバックを提供するドキュメントのセクションを強調表示します。
  3. 強調表示されたテキスト近くに表示される Add Feedback ポップアップをクリックします。

    ページの右側のフィードバックセクションにテキストボックスが表示されます。

  4. テキストボックスにフィードバックを入力し、Submit をクリックします。

    ドキュメントに関する問題が作成されます。

  5. 問題を表示するには、フィードバックビューで問題トラッカーリンクをクリックします。

第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 の使用) を参照してください。

手順

  1. RHEL で CodeReady Linux Builder (CRB) リポジトリーを有効にして、ダウンロードした JMC パッケージを RHEL にインストールできるようにします。次のアクションを完了することで、CRB リポジトリーを有効にできます。

    1. RHEL で CRB リポジトリーを有効にするには、次の RHSM コマンドを実行します。

      # subscription-manager repos --enable codeready-builder-for-rhel-9-x86_64-rpms
    2. 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 モジュールも示しています。

    3. ターゲットパッケージをインストールします。たとえば、xz-java というパッケージをインストールするには、次のコマンドを発行し、CLI コマンドプロンプトに従っていることを確認します。

      # yum install xz-java
  2. 以下のいずれかのオプションを選択し、オペレーティングシステムで 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 の使用) を参照してください。

手順

  1. ご使用のバージョンの 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 モジュールストリームにあります。

  2. オペレーティングシステムで 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 機能を使用できます。

関連情報

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) の対象外です。

手順

  1. オペレーティングシステムに応じて、以下のいずれかの方法を選択して JMC コンソールを起動します。

    1. Red Hat Enterprise Linux で、実行可能ファイルが含まれるディレクトリーに移動し、./jmc コマンドを実行します。
    2. Microsoft Windows で、jmc.exe ファイルが含まれるディレクトリーに移動し、jmc コマンドを実行します。

      注記

      システムのファイルエクスプローラーアプリケーションを使用して、いずれかのオペレーティングシステムで JMC アプリケーションを起動し、JDK Mission Control ディレクトリーに移動してから JMC 実行可能ファイルをダブルクリックします。

  2. JVM Browser ナビゲーションパネルに移動します。このパネルで、利用可能な JVM 接続を表示できます。
  3. JVM Browser パネルで、[11.0.13] The JVM Running Mission Control などのターゲット JVM インスタンスをデプロイメントします。対象の JVM インスタンスの下にアイテムリストが表示されます。
  4. ナビゲーションパネルで JMC Agent アイテムをダブルクリックします。JMC コンソールで、Start JMC Agent ウィンドウが開きます。

    図2.1 JMC Agent ウィンドウの起動

    jmc start jmc browser
  5. Browse ボタンを使用して、JMC Agent の JAR ファイルを Agent JAR フィールドに追加します。Agent XML フィールドはオプションです。

    注記

    JMC は選択したターゲット JVM インスタンスに基づいて値を自動的に追加するため、Target JVM フィールドに値を入力する必要はありません。

  6. Start ボタンをクリックします。

    JMC は、JVM Browser navigation パネルで、ターゲット JVM インスタンスの下に Agent Plugin アイテムを追加します。JMC コンソールが自動的に Agent Live Config ペインを開きます。

    図2.2 Agent Live Config ペイン

    jmc agent live config

    JMC Agent の設定や、JMC Agent と JFR データ間の対話の管理が可能になりました。XML 設定を生成して JMC コンソールにアップロードすると、Agent Live Config ペインにその XML ファイルに関連付けられたメタデータが表示されます。

    図2.3 JMC コンソールに追加された XML 設定ファイルの例

    jmc agent live config complete

2.4. JMC Agent を使用した事前設定の作成

JMC コンソールで JMC Agent インスタンスを設定できます。

JMC コンソールは、以下の JMC Agent 設定オプションを提供します。以下はその例です。

  • Agent Preset Manager オプションを使用して、カスタマイズされた事前設定を作成します。
  • XML 設定を JMC Agent の事前設定にインポートします。
  • defineEventProbes 関数を使用して、カスタム JFR イベントの XML 記述を追加します。
  • アクティブなカスタム JFR イベントを事前設定として保存し、後でそれらを取得できます。

前提条件

  • JMC コンソールで JMC Agent インスタンスを起動している。

手順

  1. メニューバーから Window をクリックし、JMC Agent Preset Manager メニュー項目をクリックすると、新しい事前設定を作成できます。JMC コンソールで JMC Agent Configuration Preset Manager ウィザードが開きます。
  2. Add ボタンをクリックして、Edit Preset Global Configurations ウィンドウにアクセスします。

    図2.4 Edit Preset Global Configurations ウィンドウ

    jmc edit preset global configurations

    このウィンドウで、事前に設定した名前を入力できます。オプションで、ターゲット JVM に挿入するイベントのクラス接頭辞を入力できます。AllowtoString チェックボックスと Allow Converter チェックボックスも選択できます。

  3. Next ボタンをクリックします。Add or Remove Preset Events ウィンドウが開きます。このウィンドウから、事前設定した新規イベントの追加、編集、削除を行うことができます。

    図2.5 事前設定イベントの追加または削除

    jmc add remove preset events
  4. ウィザードの手順に従い、以下を実行できます。

    1. イベント設定の編集
    2. パラメーターまたは戻り値手順の編集
    3. パラメーターまたは戻り値取得の編集

      ヒント

      各ウィザード手順で利用可能なボタンのいずれかを選択し、AddRemove など、希望の設定を完了できます。任意の段階で Back ボタンをクリックして、直前のウィザードステップを編集できます。

  5. Finish ボタンをクリックして Add または Remove Preset Events ウィンドウに戻ります。
  6. Next をクリックします。Preview Preset Output ウィンドウが開きます。
  7. 生成された XML データを確認してから Finish ボタンをクリックします。

    図2.6 事前設定出力のプレビュー

    jmc preview preset output
  8. JMC コンソールウィンドウの右上にある Load Preset ボタンをクリックし、事前設定を JMC アプリケーションにアップロードします。
  9. JMC Agent Configuration Preset Manager ウィンドウで、OK ボタンをクリックしてターゲット JVM に事前設定を読み込みます。JMC コンソールの Agent Live Present パネルには、アクティブなエージェント設定と、挿入されたイベントが表示されます。以下に例を示します。

    図2.7 Agent Live Present ペインの出力例

    jmc agent live config example

関連情報

2.5. JMC Agent プラグイン属性

JMC コンソールは、ボタン、ドロップダウンリスト、テキストフィールドなどの形式で多くの属性をサポートします。特定の JMC Agent 属性を使用してエージェントを設定できます。

以下の表は、JMC Agent の設定に使用できる属性のカテゴリーの概要を示しており、Agent を使用してニーズに合わせて JFR データを監視できます。

表2.1 JMC Agent で使用する設定属性のリスト。

属性説明

<allowconverter>

JMC Agent がコンバーターを使用できるかどうかを決定します。コンバーターを有効にすると、カスタムデータタイプまたはオブジェクトを JFR コンテンツタイプに変換できます。JFR は、これらのタイプをカスタムイベントと共に記録できます。

<allowtostring>

JMC Agent が配列とオブジェクトパラメーターを文字列として記録できるかどうかを決定します。

注記: toString メソッドが JMC Agent 配列要素およびオブジェクトをサポートしていることを確認します。それ以外の場合は、toString メソッドの動作により、JMC Agent で問題が発生する可能性があります。

<classPrefix>

挿入されたイベントの接頭辞接頭辞を決定します。例: __JFR_EVENT

<config>

JMC Agent の設定オプションが含まれます。

<jfragent>

イベント定義を開始します。<jfragent> 属性は、その他すべての設定属性の親属性です。

表2.2 JMC Agent で使用するイベントタイプ属性のリスト。

属性説明

<class>

メソッドからイベントタイプを受け取るクラスを定義します。

<description>

イベントタイプを記述します。

<events>

エージェントが定義済みメソッドに挿入するイベントセットをリスト表示します。イベントタグには ID が必要です。JFR は、カスタムイベントのイベントタグを使用します。

<label>

イベントタイプの名前を定義します。

<location>

挿入されたイベントを受信するメソッドの場所を決定します。たとえば、ENTRYEXITWRAP などです。

<path>

カスタムイベントを保存する場所を指すパス。このパスは、JMC コンソールのJVM Browser ナビゲーションパネルにリスト表示されているイベントに関連します。

<method>

挿入されたイベントを受信するメソッドを定義します。method 属性では、以下の 2 つの値を定義する必要があります。

  • name: メソッドの名前
  • descriptor: 正式なメソッド記述子。(ParameterDescriptors)ReturnDescriptor の形式を取ります。

<stacktrace>

イベントタイプがスタックトレースを記録するかどうかを決定します。

表2.3 JMC Agent で使用するカスタムキャプション属性のリスト。

属性説明

<converter>

属性を JFR データタイプに変換するコンバータークラスの修飾名。

<contenttype>

コンバーター属性が受信する JFR コンテンツタイプを定義します。

<description>

カスタムキャプション属性の記述。

<parameters>

任意の属性です。パラメータータグに割り当てられたインデックス値に基づくメソッドパラメーターをリスト表示します。

<name>

カスタムキャプション属性の名前。

表2.4 JMC Agent で使用するフィールドキャプチャー属性のリスト。

属性説明

<description>

取得するフィールドの記述。

<expression>

エージェントが分析して定義済みフィールドを見つける式を定義します。

<fields>

JMC Agent が定義済みイベントタイプでキャプチャーおよび出力するクラスフィールド値を決定します。

<name>

クラスフィールドキャプチャー属性の名前。

第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

関連情報

3.2. 実行中の JVM での JDK Flight Recorder の開始

jcmd ユーティリティーを使用して、診断コマンド要求を実行中の JVM に送信できます。jcmd には、startdumpstop などの最も基本的なコマンドとともに、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

関連情報

3.3. JDK Mission Control アプリケーションの使用による JVM での JDK Flight Recorder の開始

JDK Mission Control (JMC) アプリケーションにはフライトレコーダーがあります。これにより、フライトレコーティングを開始および設定できるシンプルな操作が可能になります。

手順

  1. JVM ブラウザーを開きます。

    $ JAVA_HOME/bin/jmc

  2. JVM ブラウザービューで JVM を右クリックし、Start Flight Recording を選択します。

    フライトレコーウィザードが開きます。

    図3.1 JMC JFR ウィザード

    jmc jfrwizard 2

    JDK Flight Recording Wizard には 3 つのページがあります。

    • ウィザードの最初のページには、以下を含む移動記録の一般的な設定が含まれています。

      • 記録の名前
      • 記録の保存先のパスおよびファイル名
      • 録画が固定された時間または継続的な録画であるか。イベントテンプレートが使用されます。
      • 録画の説明
    • 2 番目のページには、フライトレコーのイベントオプションが含まれます。Garbage Collections、Memory Profiling、および Method Sampling およびその他のイベントレコードの詳細レベルを設定できます。
    • 3 番目のページには、イベントの詳細の設定が含まれます。イベントをオンにまたはオフにし、スタックトレースの記録を有効にし、イベントの記録に必要な時間しきい値を変更できます。
  3. 記録の設定を編集します。
  4. Finish をクリックします。

    ウィザードは終了し、移動の記録が開始されます。

3.4. カスタムイベント API の定義と使用

JDK Flight Recorder (JFR) は、カスタムイベント API を含むイベントレコーダーです。jdk.jfr モジュールに格納されているカスタムイベント API は、アプリケーションが JFR と通信できるようにするソフトウェアインターフェイスです。

JFR API には、Java アプリケーション、JVM、またはオペレーティングシステムの記録を管理し、カスタムイベントを作成するために使用できるクラスが含まれています。

カスタムイベント API を使用してイベントをモニターする前に、カスタムイベントタイプの名前とメタデータを定義する必要があります。

Event クラスを拡張することにより、DurationInstantRequestableTime event などの JFR ベースイベントを定義できます。具体的には、期間の値などのフィールドを、アプリケーションのペイロード属性で定義されたデータ型に一致するクラスに追加できます。Event クラスを定義した後、イベントオブジェクトを作成できます。

この手順では、JFR および JDK Mission Control (JMC) でカスタムイベントタイプを使用して、単純なサンプルプログラムの実行時パフォーマンスを分析する方法を示します。

手順

  1. カスタムイベントタイプの Event クラスで、@name アノテーションを使用してカスタムイベントに名前を付けます。この名前は、JMC グラフィカルユーザーインターフェイス (GUI) に表示されます。

    Event クラスでカスタムイベントタイプ名を定義する例

    @Name(“SampleCustomEvent”)
    public class SampleCustomEvent extends Event {...}

  2. 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) などの他の単位で自動的にレンダリングします。
  3. 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 クラスがイベントを登録し、イベントループがイベントフィールドにデータを入力してから、カスタムイベントを発生させます。

  4. JMC や JFR ツールなど、選択したアプリケーションのイベントタイプを調べます。

    図3.2 JMC でイベントタイプを調べる例

    イベントタイプのサンプルアプリケーションを調べる

    JFR 記録には、さまざまなイベントタイプを含めることができます。アプリケーションで各イベントタイプを調べることができます。

関連情報

第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=falsename=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

法律上の通知

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.