スレッドダンプの読み方

6,761 views

Published on

Javaのスレッドダンプの読み方

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,761
On SlideShare
0
From Embeds
0
Number of Embeds
70
Actions
Shares
0
Downloads
28
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

スレッドダンプの読み方

  1. 1. JavaのsThread dumpの読み方 船戸 隆 2010/11/26
  2. 2. アジェンダ●Thread dumpとは●Thread dumpを取るとき●取り方●読み方●ケーススタディ
  3. 3. Thread dumpとは Java VisualVM では、ローカルアプリケーションの実行中にスレッドダンプ (スタックトレース) を取ることができます。スレッドダンプを取ってもアプリケーションが停止されることはありません。スレッドダンプを出力すると、Java スレッドのスレッド状態を含むスレッドスタックの出力が得られます。ようするに、Javaの各スレッドのメソッド呼び出しのスタックトレースとそのスレッドの実行状態を取得することができる。 各javaVM(Sun、IBM、HP、Apple・・・)などなど実装系はいくつかあって出力内容は若干違うけれど大体一緒。
  4. 4. Thread dumpを取るとき● デッドロック ● どのリソースがロックされているか?● メモリーリーク● 無限ループ ● CPUを使っているLWP(LightWeightProcess)を探す● コネクションプール枯渇● などなど、よくわからない挙動をしてたらとにかくThread dumping!
  5. 5. 取り方 ● 任意のタイミングでプロセスにSIGQUITのシ グナルを送る (Unix、Mac)、Ctrl+Break(Windows) ● 標準出力か標準エラーに出力される ● 通常はTomcatなのでcatalina.outかlocalhost.logに出力される ● 具体的にはLinuxでの例 プロセスIDは プロセスIDは $ kill -3 <プロセスID> Psコマンドやjpsコマンドで Psコマンドやjpsコマンドで 予め探しておく 予め探しておくJDI(Java Debug Interface) JDI(Java Debug Interface)を使っても取れるらしいが を使っても取れるらしいが 詳細求む 詳細求む
  6. 6. 取るときの注意●Thread dumpは数秒おきに数回とる● 無限ループの確認 – スタック状態が変わっていたらループしてない という判断● 間違えて-9を指定しない
  7. 7. 読み方● 出力されるスレッドはいっぱいある● JVM内部で使用されるスレッドも出力 – Reference HandlerとかLowMemoryDetectorとか大概無視していい – Tomcatのリクエストを受け付けるスレッドだと● 注目すべきスレッドの状態は3種類● waiting for monitor entry=ロック解放待ち● waiting on monitor = スリープ中● runnable = 実行中 =●
  8. 8. スレッドの状態● runnable ● 通常スレッドが処理を行なっている状態 – Javaコードを実行中かネイティブメソッドを実行中● 以下はソケットのIO待ち"Thread-0" prio=9 tid=0x1bef58 nid=8 lwp_id=13105 runnable [0x6fc58000..0x6fc58438] "Thread-0" prio=9 tid=0x1bef58 nid=8 lwp_id=13105 runnable [0x6fc58000..0x6fc58438]at java.net.SocketInputStream.socketRead(Native Method) at java.net.SocketInputStream.socketRead(Native Method)at java.net.SocketInputStream.read(SocketInputStream.java:90) at java.net.SocketInputStream.read(SocketInputStream.java:90)at java.net.SocketInputStream.read(SocketInputStream.java:106) at java.net.SocketInputStream.read(SocketInputStream.java:106)at SocketClose$SocketListener.run(SocketClose.java:18) at SocketClose$SocketListener.run(SocketClose.java:18)at java.lang.Thread.run(Thread.java:479) at java.lang.Thread.run(Thread.java:479)
  9. 9. スレッドの状態● waiting on monitor● スレッドダンプにwaiting on、lockedの出力が含まれる● オブジェクトに関するロックを獲得後、一旦ロックを開放 し通知(notify)を待っている状態●
  10. 10. スレッドの状態● waiting for monitor entry● デッドロックしたときにでてることが多い● オブジェクトロック待ち状態 – syncronizedなメソッドの開放待ち
  11. 11. LWP● LightWeightProcess ● ひとつのプロセスの中でさらに複数の処理を並行稼動させ るための仕組み● Javaのプロセスの内部的なLWPの情報を取得 ● それぞれのスレッドがどのように使われてるかがわかる – CPU、メモリなど● スレッドのIDと紐付け ● 右のコマンドを打つとLWPの一覧がでる – LWPの項目(10進数)を16進数に変換したものが出力 される。 $ ps -L auxw
  12. 12. ケーススタディ

×