ここでは、Identity Manager のプロファイラ機能の概要を説明します。説明する内容は次のとおりです。
プロファイラユーティリティーを使用すると、次のことが可能です。
プロファイリングデータのスナップショットを作成する。
「スナップショット」は、収集されたすべてのプロファイリング結果を最後にリセットした時点から累積された、プロファイリングの結果です。
スナップショット結果を、4 つの異なるデータビューで表示する。
「Call Tree」ビューでは、システム全体での呼び出し時間と呼び出し回数が、ツリーテーブルに表示されます。
「Hotspots」ビューでは、親にかかわらず集計された呼び出し時間が、フラット化されたノードリストに表示されます。
「Back Traces」ビューでは、そのノード (「ルートノード」と呼ばれる) が呼び出されたすべての呼び出しチェーンを、逆向きの呼び出しスタックとして表示します。
「Callees」ビューでは、親チェーンにかかわらず集められた、ルートノードの呼び出しツリーが表示されます。
スナップショットに含める情報の種類を指定する。
フォーム、ワークフロー、および XPRESS のすべての要素を含めることも、特定の要素セットだけを含めることもできます。
特定の Java メソッドやコンストラクタを選択して、計測に含めたり計測から除外したりできます。Identity Manager クラスとカスタムクラスの計測がサポートされています。
プロジェクトのスナップショットを次のように管理する。
プロジェクトの nbproject/private/idm-profiler ディレクトリまたはプロジェクト外部の任意の場所に、スナップショットを保存します。
「IDM Profiler」ビューの「Saved Snapshot」セクションで、保存されているスナップショットの一覧を表示できます。
プロジェクトからスナップショットを開くか、プロジェクト外部の任意の場所からスナップショットを読み込みます。
スナップショットを削除します。
特定のノードを名前で検索する。
ここでは、プロファイラが次の Identity Manager オブジェクトのソースをどのように検索して管理するかを説明します。
「Call Tree」ビューと「Hotspots」ビューでは、Java メソッド、ワークフロー、フォーム、規則、または XPRESS に対応する任意のノードをダブルクリックすると、そのノードのソースを表示できます。
プロファイラでスナップショットが作成されるとき、サーバーはすべてのプロファイリングデータを評価し、データがどのソースに依存しているかを調べます。次に、サーバーはこれらのソースすべてをリポジトリから取得して、スナップショットに含めます。したがって、スナップショットに表示される Identity Manager オブジェクトは、スナップショットが作成された時点の状態を正確に反映していることが保証されます。
この処理によってスナップショットのサイズは増加しますが、実際のソースのサイズは合計サイズに比べてわずかな部分にすぎません。したがって、Sun のカスタマサポートに送信するのはスナップショットのみで、ソースファイルを個別に送信する必要はありません。
Java ソースのスナップショットを作成するとき、クライアントはそのスナップショットをダウンロードし、プロジェクトより参照されるすべての Java ソースを取り込むためにスナップショットを検索します。スナップショットを保存するとき、クライアントはソースを圧縮して、スナップショットの末尾に追加します。
スナップショットを表示し Java ソースにアクセスするときは、クライアントは最初にスナップショットの内容を確認します。スナップショットに内容が見つからない場合、クライアントはプロジェクトの内容を確認します。この処理により、ユーザーのカスタム Java コードと Identity Manager コードの、両方のプロファイリングデータを含むスナップショットを送信できます。
Java ソースのスナップショットでは、ソースがサーバーで最新になっていること、または常に使用可能であることを前提としないでください。
次の節では、プロファイラから提供される結果を評価する際に考慮すべき情報について説明します。
ルートノードのセルフタイム統計を計算する場合、プロファイラは、ルートノードの合計時間からすべての子ノードの時間を減算します。
したがって、計測されていない子ノードの時間がルートノードのセルフタイムに反映されます。ルートノードのセルフタイムがかなり多い場合は、その理由を必ず調査するようにしてください。適切なメソッドで計測していないために、間違った場所を見ている可能性もあります。
たとえば、メソッド A がメソッド B を呼び出すとします。
メソッド A に合計 10 秒 (この合計時間には B の呼び出しも含まれる)、B の呼び出しに合計 10 秒がかかっています。
A と B の両方を計測していれば、呼び出しスタックにその情報が反映されます。A のセルフタイムは 0 秒、B のセルフタイムは 10 秒と表示されます (10 秒は実際に B で消費された時間)。これに対し、B を計測していない場合は、A の呼び出しに 10 秒かかり、A のセルフタイムは 10 秒であると表示されます。したがって、B ではなく A に直接問題があると考える可能性があります。
特に、最初のコンパイルで JSP のセルフタイムが多いことに気づく場合があります。収集された結果をリセットしてからページを再表示すると、セルフタイムの値はかなり少なくなります。
Java の計測方針には制限があるため、this() または super() の最初の呼び出しは、コンストラクタ呼び出しの子としてではなく兄弟として表示されます。次の例を参照してください。
class A { public A() { this(0); } public A(int i) { } } and: class B { public static void test() { new A(); } } The call tree will look like this: B.test() -A.<init>(int) -A.<init>() Rather than this: B.test() -A.<init>() -A.<init>(int) |
ReconTask.WorkerThread.run() や TaskThread.WorkerThread.run() など、Identity Manager のいくつかのデーモンスレッドで大量の時間が消費されたように見えますが、これに惑わされないでください。この時間の大部分は、イベントを待機しているスリープ中に消費されたものです。イベントの処理中に実際に消費された時間を確認するには、これらのトレースを調査する必要があります。