JProfiler ヘルプ

異常値検出と例外的メソッド記録

高度なCPU分析ビュー

ある状況では、メソッドの平均呼び出し時間が問題なのではなく、たまにメソッドが異常な動作をすることが問題となる場合があります。呼び出しツリーでは、すべてのメソッド呼び出しが累積されるため、頻繁に呼び出されるメソッドが1万回に1回だけ期待の100倍の時間がかかったとしても、合計時間には明確な痕跡が残りません。

この問題に対処するために、JProfilerは呼び出しツリー内で異常値検出ビューと例外的メソッド記録機能を提供しています。

異常値検出ビュー

異常値検出ビューでは、各メソッドの呼び出し時間や呼び出し回数に関する情報と、単一の呼び出しで計測された最大時間が表示されます。最大呼び出し時間が平均時間からどれだけ逸脱しているかによって、すべての呼び出し時間が狭い範囲に収まっているのか、それとも顕著な異常値が存在するのかを判断できます。異常値係数は次のように計算されます。

(最大時間 - 平均時間) / 平均時間

この値を使うことで、メソッドの異常性を定量的に評価できます。デフォルトでは、テーブルは異常値係数が高いメソッドが上位に表示されるようにソートされています。異常値検出ビューのデータは、CPUデータが記録されている場合に利用できます。

呼び出し回数が少ないメソッドや、非常に短時間で終了するメソッドによる過度なノイズを避けるために、ビュー設定で最大時間や呼び出し回数の下限値を設定できます。デフォルトでは、最大時間が10msを超え、かつ呼び出し回数が10回を超えるメソッドのみが異常値統計に表示されます。

例外的メソッド記録の設定

例外的な呼び出し時間を持つメソッドを特定したら、コンテキストメニューからそのメソッドを例外的メソッドとして追加できます。同じ操作は呼び出しツリービューでも利用可能です。

例外的メソッド記録にメソッドを登録すると、最も遅い呼び出しのいくつかが呼び出しツリー内で個別に保持されます。他の呼び出しは通常通り1つのメソッドノードにまとめられます。個別に保持する呼び出し数はプロファイリング設定で変更可能で、デフォルトは5です。

遅いメソッド呼び出しを判別する際には、時間計測に使用するスレッド状態を指定する必要があります。これはCPUビューのスレッド状態選択とは異なり、表示オプションではなく記録オプションです。デフォルトではウォールクロック時間が使用されますが、プロファイリング設定で別のスレッド状態を指定できます。同じスレッド状態が異常値検出ビューにも使用されます。

セッション設定では、呼び出しツリーや異常値検出ビューのコンテキスト外でも例外的メソッドの追加や削除が可能です。また、例外的メソッド設定では、AWTやJavaFXのイベントディスパッチ機構のような、特によく知られたシステム向けに例外的メソッド定義を追加するオプションも提供されています。これらのシステムでは、非常に長時間実行されるイベントが大きな問題となることがあります。

呼び出しツリー内の例外的メソッド

例外的なメソッド実行は、呼び出しツリービューで特別な表示となります。

分割されたメソッドノードには、変更されたアイコンと追加のテキストが表示されます。

  • 例外的な実行
     [例外的な実行]
    このノードには、例外的に遅いメソッド実行が含まれます。定義上、呼び出し回数は1となります。後からさらに遅い実行が増えると、このノードは消えて「マージされた例外的な実行」ノードにまとめられる場合があります(個別記録する最大数の設定による)。
  • マージされた例外的な実行
     [マージされた例外的な実行]
    例外的に遅いと判定されなかったメソッド呼び出しは、このノードにまとめられます。任意の呼び出しスタックにつき、例外的メソッドごとにこのノードは1つだけ存在します。
  • 現在の例外的な実行
     [現在の例外的な実行]
    呼び出しツリービューがJProfiler GUIに送信された時点で呼び出しが進行中だった場合、その呼び出しが例外的に遅いかどうかはまだ判明していません。「現在の例外的な実行」では、現在の呼び出しのために個別に管理されているツリーが表示されます。呼び出しが完了すると、「例外的な実行」ノードとして維持されるか、「マージされた例外的な実行」ノードにまとめられます。

プローブ分割メソッドによる呼び出しツリーの分割と同様に、例外的メソッドノードにも、コンテキストメニューから分割レベルのマージアクションを実行でき、その場ですべての呼び出しをマージ・アンマージできます。