スレッドダンプを侍にかませると、ビジュアルに表示してくれます。
スレッドの状態に応じて色分けをしてくれますが、今度新たにブロック中のスレッドも色分けしてくれるようになりました。
「ブロック中」と日本語で書くと「ブロックされているスレッド(blocked)」なのか、「ブロックしているスレッド(blocking)」なのかわかりにくいですが、後者です。
#良い日本語があったら教えてください!!
例えば Sun JVM でロック取得待ちになっているスレッド = "waiting for monitor entory" のスレッドは従来通り赤く、それらのスレッドを待たせているスレッド = "locked" があるスレッドはオレンジ色に表示されます。
単に "locked" があっても、実際に待たせているスレッドがなければオレンジ色には表示されません。
コード例を見てみましょう。
public class BlockerExample {
public static void main(String[] args) {
Thread thread1 = new AThread(args);
thread1.start();
Thread thread2 = new AThread(args);
thread2.start();
}
}
class AThread extends Thread {
Object OBJECT;
AThread(Object obj) {
this.OBJECT = obj;
}
public void run() {
while (true) {
synchronized (OBJECT) {
try {
Thread.sleep(100000);
} catch (InterruptedException ignore) {
}
}
}
}
}
上のコードはスレッドを2つ作ります。
それぞれのスレッドは
1. オブジェクトのロックを取得
2. 10秒スリープ
3. スリープ後にロックを開放
4. 1. に戻る
という単純な動作をします。
ロック対象のオブジェクトは一つしかないので2つのスレッドでオブジェクトロックを取り合う形になります。
スレッドダンプを取ると以下のようになります。
Full thread dump Java HotSpot(TM) Client VM (1.5.0_13-119 mixed mode, sharing):
---JVM内部スレッドは省略---
"Thread-1" prio=5 tid=0x0100b520 nid=0x855600 waiting for monitor entry [0xb0d0b000..0xb0d0bd90]
at samurai.core.AThread.run(BlockerExample.java:30)
- waiting to lock <0x255ecd28> (a [Ljava.lang.String;)
"Thread-0" prio=5 tid=0x0100b230 nid=0x854800 waiting on condition [0xb0c8a000..0xb0c8ad90]
at java.lang.Thread.sleep(Native Method)
at samurai.core.AThread.run(BlockerExample.java:30)
- locked <0x255ecd28> (a [Ljava.lang.String;)
---JVM内部スレッドは省略---
この場合、 Thread-1 は waiting for monitor entry 、つまりオブジェクト – <0x255ecd28> (a [Ljava.lang.String;) – のロック取得待ち(waiting to lock)でブロックされている状態です。
Thread-0 はオブジェクト – <0x255ecd28> (a [Ljava.lang.String;) – のロックを取得して、 Thread-1 を待たせています。
今までは正常に動作しているスレッドと待たせているスレッド、表示上は区別していませんでした。オレンジ色に表示される部分が今回の新機能になります。
ざっと見て赤いスレッド(待たされているスレッド)が多いようであれば、オレンジ色のスレッドをクリックして何のオブジェクトを握っているのか確認すれば ok です。
この例の様に非常にシンプルなスレッドダンプの解析でしたら侍は必要ありませんが、現実的なアプリケーションのスレッドダンプはもっともっと複雑です。
ぱっと見て怪しいスレッドがわかる侍を活用していただければ幸いです。