次の項では、フライト記録を作成する3つの方法について説明します。
フライト記録を簡単に管理するには、Java Mission Control (JMC)を使用します。最初に、図2-1に示すように、左端のフレームのJVMブラウザで、サーバーを見つけます。
デフォルトでは、ローカルで実行中のすべてのJVM一覧が表示されます。リモートJVM (JMCを実行しているユーザーと同じ実効ユーザーとして実行)は、リモートJMXエージェントを使用するように設定する必要があります(「JMXテクノロジを使用するモニタリングと管理」を参照)。次に、新しいJVM接続ボタンをクリックし、ネットワークの詳細を入力します。
JDK 8u40より前のリリースでは、-XX:+UnlockCommercialFeatures -XX:FlightRecorder
フラグを指定してJVMも起動されている必要がありました。
JDK 8u40リリースからは、Javaフライト・レコーダを実行時に有効にすることができます。
Java Mission Controlを使用してフライト記録を作成する3つの方法は次のとおりです。
実行中の記録の確認: JVMブラウザのノードを展開して実行中の記録を確認します。図2-2は、実行中の連続記録(無限大記号を持つ)と一定時間のプロファイリング記録を示しています。
任意の記録を右クリックして、記録をダンプ、編集または停止します。プロファイリング記録を停止しても記録ファイルは作成され、プロファイリング記録を閉じると記録が破棄されます。
連続記録のダンプ: JVMブラウザで連続記録を右クリックし、ファイルへのダンプを選択します。図2-3に示すように、表示されるダイアログ・ボックスで、使用可能なすべてのデータまたは記録の最後の部分のみをダンプすることを選択します。
新しい記録の開始: 新しい記録を開始するには、記録するJVMを右クリックし、「フライト記録の開始」を選択します。図2-4に示すようなウィンドウが表示されます。
図2-4に示すように、「一定時間の記録」(プロファイリング記録)または「連続記録」のいずれかを選択します。連続記録の場合は、保存するイベントの最大サイズまたは最大保持時間も指定します。
「イベント設定」を選択することもできます。独自のテンプレートを作成することもできますが、すべてのユース・ケースの99%では、連続テンプレート(記録オーバーヘッドが非常に低い )またはプロファイリング・テンプレート(より多くのデータと若干のオーバヘッド)のいずれかを選択できます。注意: プロファイリング記録の通常のオーバーヘッドは2%程度です。
完了後、「次へ」をクリックします。図2-5に示すように、次の画面では、様々なユース・ケースに合わせてテンプレートに修正を加えることができます。
図2-5 Java Mission Control - プロファイリングのイベント・オプション
デフォルトの設定では、データとパフォーマンスのバランスが良くとれています。いくつかのケースでは、別のイベントを追加する場合があります。たとえば、メモリー・リークを調査し、多くのJavaヒープを消費するオブジェクトを見つける場合は、ヒープ統計を有効にします。これにより、記録の開始時と終了時に2つのOldコレクションがトリガーされるので、待機時間が増えます。また、キャッチされた例外も含め、スローされたすべての例外を表示することも選択できます。一部のアプリケーションでは、多くのイベントが生成されます。
しきい値は、記録イベントの長さです。たとえば、デフォルトでは、10msを超える同期イベントが収集されます。これは、スレッドが10msを超えてロックを待機している場合、イベントが保存されることを意味します。短い競合の詳細データを取得するには、この値を下げることができます。
「スレッド・ダンプ」の設定は、定期的なスレッド・ダンプを実行するためのオプションを提供します。これらは、診断コマンドThread.print
の使用、またはjstack
ツールの使用により取得されるような、通常のテキストのスレッド・ダンプです。スレッド・ダンプは、イベントを補完します。
JFRフラグの詳細は、拡張ラインタイム・オプションを参照してください。
コマンド行で起動フラグを使用してフライト記録を作成する3つの方法は次のとおりです。
プロファイリング記録の開始: -XX:StartFlightRecording
オプションを使用して、アプリケーションの起動時に一定時間の記録を設定できます。JFRは商用の機能なので、-XX:+UnlockCommercialFeatures
オプションを指定する必要があります。次の例は、MyApp
アプリケーションを実行し、JVMを起動してから20秒後に60秒間の記録を開始し、それをmyrecording.jfr
という名前のファイルに保存する方法を示しています。
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=delay=20s,duration=60s,name=myrecording,filename=C:\TEMP\myrecording.jfr,settings=profile MyApp
settingsパラメータにはテンプレートへのパスまたはテンプレート名を指定します。デフォルトのテンプレートはjre/lib/jfr
フォルダにあります。2つの標準プロファイルがあります: デフォルトは、主に連続記録のために作成されたオーバーヘッドの低い設定で、プロファイルは、より多くのデータを収集し、主にプロファイリング記録用です。
連続記録の開始: -XX:FlightRecorderOptions
を使用して、コマンド行から連続記録を開始することもできます。これらのフラグは、必要に応じて後でダンプできる連続記録を開始します。次の例は、連続記録を示しています。一時データはディスクに保存され(/tmp
フォルダ)、6時間のデータが保存されます。
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=defaultrecording=true,disk=true,repository=/tmp,maxage=6h,settings=default MyApp
注意: 実際に記録をダンプするときは、ダンプ・ファイルのための新しい場所を指定するので、リポジトリ内のファイルは一時的です。
Javaフライト記録の構成および管理の詳細は、『Java Flight Recorderランタイム・ガイド』の第2章を参照してください。
診断コマンドの使用:
Javaコマンド行の診断コマンドを使用して記録を制御することもできます。診断コマンドを実行するもっとも単純な方法は、Javaインストール・ディレクトリにある jcmd
ツールを使用することです。詳細は、「jcmdユーティリティ」を参照してください。
条件が満たされた場合にフライト記録を自動的に開始またはダンプするようにJava Mission Controlを設定できます。これはJMXコンソールから実行します。JMXコンソールを起動するには、JVMブラウザでアプリケーションを見つけてそれを右クリックし、JMXブラウザの起動を選択します。
図2-6に示すように、画面の下部にある「トリガー」タブを選択します。
アプリケーション内の任意のMBean
にトリガーを作成することがきます。高いCPU使用率、デッドロック・スレッド、過剰なライブ・セットなどのいくかの一般的な条件のためのデフォルト・トリガーが設定されています。「追加」を選択して、アプリケーション内の任意のMBean
(アプリケーションに固有のものを含む)を選択します。トリガーを選択するとき、満たす必要のある条件も選択できます。詳細は、右上の疑問符をクリックして組込みのヘルプを参照してください。
複数のトリガーを実行するには、トリガーの横のボックスをクリックします。
条件を選択したら、「アクション」タブをクリックします。次に、条件が満たされたときに実行する処理を選択します。最後に、図2-7に示すように、連続記録のダンプまたは期間限定のフライト記録の開始のいずれかを選択します。