異常値検出と例外的メソッド記録
ある状況では、メソッドの平均呼び出し時間が問題ではなく、時折メソッドが誤動作することが問題となることがあります。呼び出しツリーでは、すべてのメソッド呼び出しが累積されるため、頻繁に呼び出されるメソッドが1万回の呼び出しのうち1回だけ期待の100倍の時間がかかる場合、合計時間には明確な痕跡を残しません。
この問題に対処するために、JProfilerは呼び出しツリーにおける異常値検出ビューと例外的メソッド記録機能を提供します。
異常値検出ビュー
異常値検出ビューは、各メソッドの呼び出し時間と呼び出し回数に関する情報を、単一の呼び出しで測定された最大時間と共に表示します。最大呼び出し時間と平均時間の偏差は、すべての呼び出し時間が狭い範囲にあるか、または顕著な異常値があるかを示します。異常値係数は次のように計算されます。
(最大時間 - 平均時間) / 平均時間
これにより、この点でメソッドを定量化するのに役立ちます。デフォルトでは、異常値係数が最も高いメソッドが上位に表示されるようにテーブルがソートされています。異常値検出ビューのデータは、CPUデータが記録されている場合に利用可能です。
数回しか呼び出されないメソッドや非常に短時間で実行されるメソッドからの過剰な混乱を避けるために、最大時間と呼び出し回数の下限をビュー設定で設定できます。デフォルトでは、最大時間が10ms以上で呼び出し回数が10を超えるメソッドのみが異常値統計に表示されます。
例外的メソッド記録の設定
例外的な呼び出し時間を持つメソッドを特定したら、コンテキストメニューでそれを例外的メソッドとして追加できます。同じコンテキストメニューアクションは、呼び出しツリービューでも利用可能です。
例外的メソッド記録のためにメソッドを登録すると、最も遅い呼び出しのいくつかが呼び出しツリーに個別に保持されます。他の呼び出しは通常通り単一のメソッドノードにマージされます。個別に保持される呼び出しの数はプロファイリング設定で設定できます。デフォルトでは5に設定されています。
遅いメソッド呼び出しを区別する際には、時間測定のために特定のスレッド状態を使用する必要があります。これはCPUビューのスレッドステータス選択ではなく、表示オプションであり記録オプションではありません。デフォルトではウォールクロック時間が使用されますが、プロファイリング設定で異なるスレッドステータスを設定できます。同じスレッド状態が異常値検出ビューにも使用されます。
セッション設定では、呼び出しツリーや異常値検出ビューのコンテキストなしで例外的メソッドを削除したり、新しいものを追加したりできます。また、例外的メソッド設定では、AWTやJavaFXのイベントディスパッチメカニズムのような、例外的に長時間実行されるイベントが大きな問題となる既知のシステムに対して例外的メソッド定義を追加するオプションを提供します。
呼び出しツリー内の例外的メソッド
例外的メソッドの実行は、呼び出しツリービューで異なる表示がされます。
分割されたメソッドノードは、変更されたアイコンと追加のテキストを表示します:
-
[例外的な実行]
このノードには、例外的に遅いメソッド実行が含まれています。定義により、呼び出し回数は1になります。後で多くの他のメソッド実行が遅くなると、このノードは消えて、設定された最大数の個別に記録されたメソッド実行に応じて「マージされた例外的実行」ノードに追加される可能性があります。 -
[マージされた例外的実行]
例外的に遅いと見なされないメソッド呼び出しは、このノードにマージされます。任意の呼び出しスタックに対して、例外的メソッドごとに1つのノードしか存在できません。 -
[現在の例外的実行]
呼び出しツリービューがJProfiler GUIに送信されたときに呼び出しが進行中であった場合、その呼び出しが例外的に遅いかどうかはまだわかりませんでした。「現在の例外的実行」は、現在の呼び出しのために個別に維持されたツリーを示します。呼び出しが完了すると、それは「例外的実行」ノードとして個別に維持されるか、「マージされた例外的実行」ノードにマージされます。
プローブや 分割メソッドによる呼び出しツリーの分割と同様に、例外的メソッドノードには、コンテキストメニューで呼び出しをその場でマージおよびアンマージするための分割レベルをマージアクションがあります。