JProfiler ヘルプDownload

呼び出しツリーの分割


呼び出しツリーは、同じ呼び出しスタックの繰り返し呼び出しに対して累積されます。これは、メモリのオーバーヘッドとデータを理解しやすくするために統合する必要があるためです。しかし、時には選択したポイントで累積を分割し、呼び出しツリーの一部を個別に表示したいことがあります。

JProfilerには、呼び出しスタックに特別なノードを挿入し、挿入されたノードの上にあるメソッド呼び出しから抽出されたセマンティック情報を表示することで、呼び出しツリーを分割するという概念があります。これらの分割ノードにより、呼び出しツリー内で追加のペイロード情報を直接確認し、それらのサブツリーを個別に分析することができます。各分割タイプは、コンテキストメニューのアクションで動的にマージおよびアンマージでき、メモリのオーバーヘッドが制限されるように分割ノードの総数に上限があります。

呼び出しツリーの分割とプローブ

プローブは、興味のある選択されたメソッドで収集した情報に基づいて呼び出しツリーを分割できます。例えば、「HTTPサーバー」プローブは、各異なるURLに対して呼び出しツリーを分割します。この場合の分割は非常に設定可能で、URLの必要な部分のみを含めたり、サーブレットコンテキストからの他の情報を含めたり、複数の分割レベルを生成したりすることができます。

独自のプローブを作成する場合、埋め込みおよび注入カスタムプローブシステムの両方で、同じ方法で呼び出しツリーを分割できます。

スクリプトによるメソッドの分割

プローブで利用可能な同じ分割機能を、スクリプトでメソッドを分割アクションを使用して、直接呼び出しツリーで使用できます。以下のスクリーンショットでは、JMSメッセージハンドラの呼び出しツリーを分割して、異なるタイプのメッセージの処理を個別に確認したいと考えています。

プローブを書く代わりに、文字列を返すスクリプトを入力します。この文字列は、選択したメソッドで呼び出しツリーをグループ化するために使用され、分割ノードに表示されます。nullを返すと、現在のメソッド呼び出しは分割されず、通常通り呼び出しツリーに追加されます。

スクリプトは多くのパラメータにアクセスできます。選択したメソッドのクラス、非静的メソッドの場合はインスタンス、およびすべてのメソッドパラメータが渡されます。さらに、データを保存するために使用できるScriptContextオブジェクトを取得します。同じスクリプトの以前の呼び出しからいくつかの値を思い出す必要がある場合、コンテキストでgetObject/putObjectおよびgetLong/putLongメソッドを呼び出すことができます。例えば、特定のメソッドパラメータの値が初めて見られたときにのみ分割したい場合があります。その場合、次のように使用できます。

if (scriptContext.getObject(text) != null) {
    scriptContext.putObject(text);
    return text;
} else {
    return null;
}

これは分割スクリプトの一部です。

分割ノードは選択したメソッドの下に挿入されます。上記のスクリーンショットの例では、各JMSメッセージの宛先に対する処理コードを個別に確認できます。

分割の場所は選択した呼び出しスタックではなく、メソッドにバインドされています。同じメソッドが呼び出しツリーの他の場所に存在する場合、それも分割されます。分割レベルをマージアクションを使用すると、すべての分割が単一のノードにマージされます。そのノードは、再度分割を解除する機会を提供します。

あまりにも多くの分割を生成すると、制限されたメソッド分割とラベル付けされたノードに、すべてのさらなる分割呼び出しが単一のツリーに累積されます。ノード内のハイパーリンクを使用して、キャップカウンターをリセットし、さらに分割ノードを記録できます。分割の最大数を恒久的に増やすには、プロファイリング設定でキャップを増やすことができます。

作成後に分割メソッドを編集するには、セッション設定ダイアログに移動します。特定の分割メソッドがもう必要ないが、将来の使用のために保持したい場合、スクリプト設定の前のチェックボックスを使用して無効にできます。これは、呼び出しツリーで単にマージするよりも優れています。なぜなら、記録のオーバーヘッドが重要である可能性があるからです。