プロジェクト

全般

プロフィール

Java Flight Recorder

JavaVMの実行時の情報を取得するツールで、Java SE 7u40からOracle JDKに同梱されています。
本番環境でも適用できるよう計測のオーバーヘッドを少なくするように設計されています。

ツールの操作

レコーディングの種類

  • 連続レコーディング
    • 結果を取得するには明示的にダンプ操作が必要
  • 時間限定レコーディング
    • 指定した時間だけレコーディング
    • Mission Controlからレコーディング開始した場合、自動でMission Controlにダウンロードされる

レコーディングの準備

JavaVMの起動時に次のオプション指定が必須でしたが、Java SE 8u40からはオプション指定がなくても再起動せずに取得可能となりました。

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder

リモートから監視する場合、com.sun.managementフラグを指定

JVM起動直後からレコーディング開始する場合

JVM起動時の必須オプションに追加して指定する例

-XX:StartFlightRecording=delay=20s,duration=60s,name=MyRecording,filename=C:\TEMP\myrecording.jfr,settings=profile

  • 起動後にdelay=20sで指定した20秒後からレコーディングを開始します。
  • duration=60sで指定した60秒間の時間限定レコーディングを行います。
    duration指定がないと連続レコーディングを行います。
  • name=MyRecordingでJava Flight Recorderの識別子を指定します。
  • filename=C:\TEMP\myrecording.jfrでレコード結果を記録するファイルを指定します。
  • settings=profileで設定種類(設定ファイル)を指定します。Java SEのデフォルトの設定ファイルは<JREディレクトリ>\lib\jfr\にあります(default.jfc、profile.jfc)。

デフォルトレコーディング

連続レコーディングの便利な指定が可能、以下は起動時に連続レコーディングを開始し、JVM終了時にダンプファイルをC:\demos\dumponexit.jfrに生成します。

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder 
-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=C:\demos\dumponexit.jfr

途中でダンプさせたいときは、Java Mission Controlを接続してダンプ操作をするか、コマンドjcmdでダンプ操作をします。

レコーディングの生成

Mission Controlから

  • JVMブラウザ上で対象JVMを選び
  • そのJVMのFlight Recorderノードをダブルクリックし、ウィザードに従う
  • レコーディング中の場合はFlight Recorderノードの下にリストされるので、ダブルクリックまたはエディター領域にドラッグ&ドロップ
  • レコードファイルは、次のディレクトリに生成される
    • Windows OSの場合、%USERPROFILE%\.jmc\<バージョン番号>\flight_recording_*.jfr

jcmdから

書式:jcmd <pid> <command>

レコーディング開始の例

jcmd 7060 JFR.start name=MyRecording settings=profile
 delay=20s duration=2m filename=C:\TEMP\myrecording.jfr

レコーディングの確認の例

jcmd 7060 JFR.check

レコーディングのダンプの例

jcmd 7060 JFR.dump name=MyRecording filename=C:\TEMP\dump.jfr

ライセンスについて

Java Flight Recorderは、有償のJava SE Advanced契約を結んだユーザーに提供される商用機能です。
ところが、この「商用」の範囲がどこになるのか線引きが明確でないのが困ったことです(矛盾すると受け取れるメッセージがあちこちで発信されています)。

ライセンスについて触れているOracle公式文書 

Java SE JDKのBCL

Java SE JDKのBCL(Oracle Binary Code License Agreement for the Java SE Platform Products and JavaFX)に定義される開発用途1での利用は無料と思われます。

1 JDKに含まれるBCLメモ

  • "SUPPLEMENTAL LICENSE TERMS"の"A. COMMERCIAL FEATURES."に、B,C,D及びEのすべてを満たさない場合はCommercial Featuresを使用できないとある
  • "B. SOFTWARE INTERNAL USE FOR DEVELOPMENT LICENSE GRANT."に、利用者のプログラムを利用者の組織内で設計、開発、テストする目的での使用について言及がある

Java Platform Standard Edition 8 Documentation

Oracle JDKの公式サイトで公開されているJava SE 8のドキュメント "Java Platform Standard Edition 8 Documentation"の一部にある
Troubleshooting Guide
には、2.2項に次の記述があります。

The Java Flight Recorder (JFR) is a commercial feature. You can use it for free on developer desktops/laptops, and for evaluation purposes in test, development, and production environments. However, to enable JFR on a production server, you require a commercial license. Using JMC UI for other purposes on the JDK does not require a commercial license.

同文書の日本語版
http://docs.oracle.com/javase/jp/8/docs/technotes/guides/troubleshoot/tooldescr.html
に上述の翻訳文章が記載されています。

Java Flight Recorder (JFR)は商用機能です。開発者のデスクトップ/ラップトップ上では無償で、また評価目的であればテスト環境、開発環境および本番環境で使用できます。ただし、JFRを本番サーバーで有効にする場合は、商用ライセンスが必要です。それ以外の目的でJMC UIをJDK上で使用する場合、商用ライセンスは必要ありません。

Oracleの公式文書を見てのライセンス範囲は?

運用環境ではなく開発/試験環境において開発/試験用途に使用することはJava SE Advanced契約ではなく、Java SE Developer Kit(JDK)のライセンス範囲で可能になるかと思われます。

ライセンスについて言及のあるもの

Marcus Hirt氏の個人ブログに、Henrik Stahl氏が付けたコメントには、
http://hirt.se/blog/?p=597

As per the Binary Code License, all usage for evaluation and development (on your laptop/workstation) is always royalty free (even if/when you use the commercial features flag). As a developer, you can use JMC and JFR to build, debug and optimize your application without owing Oracle a cent. We only charge for production use – so if you build a web app and deploy it to a server and the JVM that runs it has the commercial features flag enabled then you need a Java SE Advanced license for the server. The desktop that runs the JMC GUI never needs a license.

とあります。

参考資料

クリップボードから画像を追加 (サイズの上限: 1 GB)