JProfiler ヘルプ

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

高度なCPU分析ビュー

状況によっては、問題となるのはメソッドの平均呼び出し時間ではなく、そのメソッドが時折異常な動作を示すことです。呼び出しツリーではすべてのメソッド呼び出しが集計されるため、10,000回の呼び出しのうち1回だけ想定の100倍の時間がかかる頻繁に呼び出されるメソッドであっても、合計時間には明確な痕跡が残りません。

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

異常値検出ビュー

異常値検出ビューには、各メソッドの呼び出し時間や呼び出し回数に関する情報が、単一の呼び出しで測定された最大時間とともに表示されます。最大呼び出し時間の平均時間からの偏差により、すべての呼び出し時間が狭い範囲に収まっているか、あるいは重大な異常値が存在するかどうかが分かります。次のように計算される異常値係数は、

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

この観点でメソッドを定量化するのに役立ちます。デフォルトでは、異常値係数が最も高いメソッドが先頭になるようにテーブルがソートされます。異常値検出ビューのデータは、CPUデータが記録されている場合に利用できます。

数回しか呼び出されないメソッドや、実行時間が極めて短いメソッドによって過度に煩雑になるのを防ぐため、ビュー設定で最大時間と呼び出し回数の下限しきい値を設定できます。デフォルトでは、最大時間が10 msを超え、呼び出し回数が10回を超えるメソッドのみが異常値統計に表示されます。

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

例外的な呼び出し時間が発生しているメソッドを特定したら、コンテキストメニューから例外的メソッドとして追加できます。同じコンテキストメニューアクションは、呼び出しツリービューでも利用できます。

メソッドを例外的メソッド記録に登録すると、最も遅いいくつかの呼び出しが呼び出しツリー内で個別に保持されます。それ以外の呼び出しは、通常どおり単一のメソッドノードにマージされます。個別に保持される呼び出しの数はプロファイリング設定で設定できます。デフォルトでは5に設定されています。

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

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

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

呼び出しツリービューでは、例外的な実行は異なる形式で表示されます。

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

  •  [exceptional run]
    このようなノードには、例外的に遅いメソッド実行が含まれます。定義上、その呼び出し回数は1になります。後から他の多数のメソッド実行の方が遅くなった場合、個別に記録されるメソッド実行の設定された最大数に応じて、このノードは非表示になり「merged exceptional runs」ノードに追加されることがあります。
  •  [merged exceptional runs]
    例外的に遅いと判定されなかったメソッド呼び出しは、このノードにマージされます。どの呼び出しスタックにおいても、例外的メソッドごとに存在できるこのようなノードは1つだけです。
  •  [current exceptional run]
    呼び出しツリービューがJProfiler GUIに送信された時点で呼び出しが実行中だった場合、その呼び出しが例外的に遅いかどうかはまだ判明していません。「current exceptional run」は、現在の呼び出し用に個別に維持されているツリーを表示します。呼び出しが完了すると、個別の「exceptional run」ノードとして維持されるか、「merged exceptional runs」ノードにマージされます。

プローブや分割メソッドによる呼び出しツリーの分割と同様に、例外的メソッドノードのコンテキストメニューには、すべての呼び出しをその場でマージおよびマージ解除できるMerge splitting levelアクションが用意されています。