連載
» 2005年04月16日 00時00分 公開

ソフトウェアの品質向上を支援するプラグインCoolなEclipseプラグイン(2)(3/3 ページ)

[岡本隆史,NTTデータ オープンソース開発センタ]
前のページへ 1|2|3       

3.Enerjy Thread Profile

 プログラムのデバッグの際にスレッド周りの不具合を検出するのは、簡単ではありません。Enerjy Thread Profilerを利用すると、デッドロックの検出やスレッドのモニタリングをGUIで非常に簡単に行うことができます。GUIによる分かりやすいグラフにより、スレッドに関する問題の発見、アプリケーションチューニングを簡単に行うことができます。

■特長

 Enerjy Thread Profilerの特長は以下のとおりです。

・デッドロック検出機能
 デッドロックを自動的に検出し、表示します。

・スレッドモニタリング
 ヒープとスレッドの状態をグラフで表示し、モニタリングすることができます。

・少ないオーバヘッド
 プロファイルを行ってもプログラムのオーバヘッドが少なくて済みます。

・リモートプロファイリング
 別のマシン上で実行されているアプリケーションのプロファイリングを行うことができます。

■入手方法

 Enerjy Thread Profilerは、無料ではありません。下記のURLからソフトウェアのダウンロードとライセンスの取得を行ってください。

 ライセンスを取得したら、Eclipseのメニューの[ウィンドウ]→[設定]からEnerjyを選択し、Thread Profilerを選択し、取得したシリアル番号とシリアルキーを入力します。5日間の試用ライセンスもありますので、まずは、そちらで評価し、導入効果を実感してから購入すると良いでしょう。

■使い方

 プロファイルしたいアプリケーションをあらかじめEclipse上で実行します。その後、Eclipseのメニューの「実行」「構成をプロファイル」「Thread」で実行名を選択すると、スレッドプロファイリングを開始します。

図7 Thread Profilerの起動 図7 Thread Profilerの起動

 ここでは、次のようなデッドロックを引き起こすサンプルアプリケーションを実行してみます。

public class Deadlock extends Thread {
   public static Object l1 = new Object();
   public static Object l2 = new Object();
   private int index;
   public static void main(String[] a) {
      Thread t1 = new ThreadA();
      Thread t2 = new ThreadB();
      t1.start();
      t2.start();
   }
   
   private static class ThreadA extends Thread {
      public void run() {
         synchronized (l1) {
            System.out.println("スレッド1: l1に対するロックを取得");
            try { Thread.sleep(10); }
            catch (InterruptedException e) {}
            System.out.println("スレッド1: l2のロックの開放待ち");
            synchronized (l2) {
                System.out.println("スレッド1: l1、l2に対するロックを取得");
            }
         }
      }
   }
   
   private static class ThreadB extends Thread {
      public void run() {
         synchronized (l2) {
            System.out.println("スレッド2: l2に対するロックを取得");
            try { Thread.sleep(10); }
            catch (InterruptedException e) {}
            System.out.println("スレッド2: l1のロックの開放待ち");
            synchronized (l1) {
                System.out.println("スレッド1: l1、l2に対するロックを取得");
            }
         }
      }
   }
}

 上記のクラスに対して、Thread Profilerを実行すると、次のような画面が表示されます。

図8 Thread Profilerの実行画面 図8 Thread Profilerの実行画面

 中央のビューにスレッドの状態を表すグラフが表示されます。スレッドの状態をグラフで表すビューの各色は次のような意味を持ちます。

説明
実行中
ロック開放待ち
水色 スリープ
デッドロック
待機中

 この例では、デッドロックが発生したため、DEADLOCK!と表示されて(図8の丸数字1の個所)プログラムが停止しています。このようにThread Profilerはデッドロックを自動的に検出してくれます。ここで、グラフ上の青(デッドロック)の部分(図8の丸数字2の個所)をダブルクリックすると、画面右にアイコン(図8の丸数字3の個所)が表示されます。このアイコンをダブルクリックすると、デッドロックが発生している部分のコードを表示することができます(図9)。

図 9 デッドロックの発生個所の表示 図 9 デッドロックの発生個所の表示

 Enerjy Thread Profilerは有償のツールではありますが、いま紹介したようにスレッドダンプを取りながらスレッド動作の解析を行うのに比べると解析のコストを減らすことができます。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。