同一の呼び出しスタックが繰り返し呼び出される場合、呼び出しツリーは累積されます。これは、メモリオーバーヘッドを抑え、データを理解しやすく集約するために必要です。しかし、呼び出しツリーの一部を個別に確認できるように、選択したポイントで累積を区切りたい場合もあります。
JProfilerには、呼び出しスタックに特殊なノードを挿入して呼び出しツリーを分割するという概念があります。このノードは、挿入されたノードの直上のメソッド呼び出しから抽出されたセマンティック情報を表示します。これらの分割ノードにより、呼び出しツリー内で追加のペイロード情報を直接確認し、そこに含まれるサブツリーを個別に分析することができます。各分割タイプは、コンテキストメニューのアクションを使用してその場でマージおよびマージ解除でき、メモリオーバーヘッドが制限されるように分割ノードの総数に上限が設けられています。
呼び出しツリーの分割とプローブ
プローブは、対象として選択されたメソッドで収集した情報に従って、呼び出しツリーを分割できます。たとえば、「HTTP server」プローブはURLごとに呼び出しツリーを分割します。この場合の分割は高度に設定可能であり、URLの必要な部分のみを含めたり、サーブレットコンテキストの他の情報を含めたり、複数の分割レベルを生成したりすることさえ可能です。
独自のプローブを作成する場合、埋め込みおよびインジェクションの両方のカスタムプローブシステムを使用して、同様に呼び出しツリーを分割できます。
スクリプトによるメソッドの分割
プローブで利用可能なのと同じ分割機能は、スクリプトでメソッドを分割アクションを使用して、呼び出しツリー内で直接使用できます。下のスクリーンショットでは、JMSメッセージハンドラーの呼び出しツリーを分割して、異なるタイプのメッセージの処理を個別に確認できるようにしています。
プローブを作成する代わりに、文字列を返すスクリプトを入力するだけです。その文字列は、選択されたメソッドで呼び出しツリーをグループ化するために使用され、分割ノードに表示されます。nullを返した場合、現在のメソッド呼び出しは分割されず、通常どおり呼び出しツリーに追加されます。
スクリプトはいくつかのパラメータにアクセスできます。選択されたメソッドのクラス、非staticメソッドのインスタンス、およびすべてのメソッドパラメータが渡されます。さらに、データを保存するために使用できるScriptContextオブジェクトを取得します。同じスクリプトの過去の呼び出しからの値を再取得する必要がある場合は、コンテキスト内のgetObject/putObjectおよびgetLong/putLongメソッドを呼び出すことができます。たとえば、メソッドパラメータの特定の値が初めて出現したときにのみ分割したい場合があります。その場合は次のように使用できます。
if (scriptContext.getObject(text) == null) {
scriptContext.putObject(text, text);
return text;
} else {
return null;
}
これを分割スクリプトの一部として使用できます。
分割ノードは、選択されたメソッドの下に挿入されます。上のスクリーンショットの例では、JMSメッセージの宛先ごとに処理コードが個別に表示されるようになります。
分割位置は、選択された呼び出しスタックではなく、メソッドに関連付けられます。同じメソッドが呼び出しツリーの他の場所に存在する場合、それも同様に分割されます。分割レベルをマージアクションを使用すると、すべての分割が単一のノードにマージされます。そのノードから、分割を再度マージ解除することができます。
生成される分割が多すぎる場合、上限に達したメソッド分割というラベルの付いたノードに、それ以降のすべての分割呼び出しが単一のツリーに累積されて含まれます。ノード内のハイパーリンクを使用すると、上限カウンターをリセットしてさらにいくつかの分割ノードを記録できます。分割の最大数を恒久的に増やすには、プロファイリング設定で上限を増やすことができます。
作成した分割メソッドを編集するには、セッション設定ダイアログに移動します。特定の分割メソッドが不要になったものの、今後の使用のために保持しておきたい場合は、スクリプト設定の前にあるチェックボックスで無効にすることができます。記録のオーバーヘッドが大きくなる可能性があるため、これは呼び出しツリーで単にマージするよりも優れた方法です。













