入門: スレッド・ボトルネック検出

競合やデッドロックなどのスレッド・ボトルネックは、アプリケーションを低速にしたり、一時停止させる原因になります。「プロファイルおよびロギング」パースペクティブには、このようなスレッド問題を検出し、解決する際に役立つビューとツールが組み込まれています。

以下のビューを使用して、スレッド・ボトルネックを検出することができます。

スレッド・ボトルネックを検出する作業を行う際に、「プロファイル・モニター」 ビューでプロファイル・リソースの選択を行うことがしばしばあります。

また、Probekit で設計したカスタム・プローブを使用して、スレッド・ボトルネックを調べることもできます。

スレッド・ボトルネック検出のためのデータ収集

「スレッド分析 (Thread Analysis)」プロファイル・セットを使用して、 ご使用のアプリケーションにおけるスレッド・ボトルネックに関するデータを収集することができます。

前提条件:

データを収集するには、次の手順を実行します。
  1. 「実行」 > 「プロファイル」とクリックする。
  2. 「プロファイル」ダイアログ・ボックスの「プロファイル」ページで、「スレッド分析 (Thread Analysis)」プロファイル・セットを選択する。
  3. プロファイル」をクリックして、ご使用のアプリケーションを開始する。
  4. スレッド・ボトルネックを起こしていると考えられるアプリケーション部分を実行してみる。スレッド・データが収集され、「スレッド分析 (Thread Analysis)」プロファイル・リソースに記録されます。この情報は、「プロファイル・ナビゲーター (Profiling Navigator)」に表示されます。これでアプリケーションを停止することができます。

スレッド・ボトルネック検出のための「スレッド・ビュー」、「呼び出しスタック・ビュー (Call Stack View)」、および「UML2 シーケンス図」ビューの使用

「スレッド・ビュー」で、 ご使用のアプリケーション内のすべてのスレッドに対するスレッド実行ヒストリーの表示、 およびデッドロックと競合の明示的な表示が可能です。「呼び出しスタック・ビュー (Call Stack View)」には、選択済みのプロファイル・リソースのすべてのスレッドのスタック・フレームが表示されます。「UML2 オブジェクト相互作用」ビューには、プロファイル実行中の呼び出しのシーケンスが表示されます。

スレッド・ボトルネックを検出するには、以下の手順を実行します。
  1. 「スレッド・ビュー」を表示する: 収集したデータのプロファイル・リソースを右クリックし、そのポップアップ・メニューから「アプリケーションから開く」 > 「スレッド・ビュー」と選択する。
  2. 「スレッド・ビュー」で、スレッド間の垂直方向の矢印を探す。垂直方向矢印は、ロックを要求しているスレッドから、そのロックを保持するスレッドへポイントされます。 1 つの矢印は、あるスレッドが、別のスレッドがロックを解放するのを待機している、スレッド競合を示します。複数の矢印は、2 つのスレッドが同じデッドロック・スレッド状態に属しているデッドロックを指示します。
  3. ボトルネックの時点で呼び出されたメソッドを識別する。 メソッドを識別するには、以下のステップを実行します。
    1. スレッドが待機しているロックの名前を検索する。「スレッド・ビュー」で、ロックを待機しているロケーションのスレッドの上にカーソルを一時停止させる。 これにより、ロックの名前のほか、ロックを保持しているロック・スレッドの名前もツールチップに表示されます。
    2. 「プロファイル・モニター」ビューで「スレッド分析 (Thread Analysis)」プロファイル・リソース を右クリックして、「アプリケーションから開く」 > 「UML2 オブジェクト相互作用」とクリックする。 「UML2 オブジェクト相互作用」ビューは、Java クラス・インスタンス間のメソッド呼び出しを示します。
    3. 「スレッド・ビュー」で、調べたい要求の矢印の上に、「現在時刻」インディケーターを位置付ける。これにより、「UML2 オブジェクト相互作用」ビューと、「呼び出しスタック・ビュー (Call Stack View)」内の 「呼び出しスタック (Call Stack)」プロファイル・リソースの両方が同期化されます。 デフォルトでは、「現在時刻」インディケーターは「スレッド・ビュー」グラフの左端にあります。このインディケーターを移動するには、新しい位置にドラッグするか、「スレッド・ビュー」内の「秒 (seconds)」時刻ルーラーをクリックします。
  4. 使用可能な場合、ロックを保持しているソース・コードを表示する。 このためには、以下の手順を実行します。
    1. 「スレッド・ビュー」のタイトル・バーにあるドロップダウン・メニューをクリックして、 「呼び出しスタック・ビューを開く (Open Call Stack View)」をクリックする。
    2. ロックを保持しているスレッドの「呼び出しスタック (Call Stack)」の最新の呼び出しを右クリックし、そのポップアップ・メニューから「ソースを開く」をクリックする。 ソース・コードが使用可能なのは、現在 Java パースペクティブで開かれている Java™ プロジェクトをプロファイルする場合のみです。これで、ボトルネックを解決するため、コードに変更を 加えることができます。
  5. ボトルネックを修正したかどうかを検証するため、 もう一度アプリケーションのプロファイルを作成してください。

詳しくは、『スレッド・ボトルネックの検出』をお読みください。

「実行フロー」および「実行フロー・テーブル」ビューの使用

これらのビューでは、さまざまな形式で、「スレッド・ビュー」の基になっている生データが表示されます。

これらのビューを使用するには、以下の手順を実行します。
  1. 「実行フロー」および「実行フロー・テーブル」ビューを表示するには、 「ウィンドウ」 > 「ビューの表示」 > 「その他」と選択し、「ビューの表示」ダイアログ・ボックスで 「プロファイルおよびロギング」エントリーを展開し、表示したいビューを選択する。
  2. 「実行フロー」および「実行フロー・テーブル」ビューでは、ポップアップ・メニューから「補償時間」を選択することで、プロファイルに起因する時間を減算することができる。

フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.