スレッドダンプ とは?
* 全スレッドのスタックトレース
スレッドダンプ取得方法
概要
[1] JavaのプロセスIDを確認 [2] jstackコマンド等でスレッドダンプを取得
詳細
[1] JavaのプロセスIDを確認# JPSコマンド : JVMプロセスを表示(プロセスIDとプロセス名が表示される) jps # JCMDコマンド:JavaプロセスID取得 jcmd # Linuxの場合 ps aux | grep java[2] jstackコマンド等でスレッドダンプを取得
jstack 【プロセスID】 > threaddump.txt or kill -3 【プロセスID】
例 : Tomcat のスレッドダンプを取得する
[1] jps を実行jps 19591 Bootstrap << BootstrapがTomcat[2] jstack を実行
jstack Bootstrap > threaddump.log
スレッドダンプを取得する際の注意点
[1] 一定の間隔で スレッドダンプを複数取得する(例:10 秒ごとに 1 つのスレッドダンプ) Case A : 全スレッドの状態遷移がない => ハング Case B : スレッド処理が進んでいる => 遅い
スレッドの状態
java.lang.Thread.State: WAITING (on object monitor) ~~~~~~~ みたいな形で、スレッドの状態がわかる
`# | `状態 | `意味 | `備考 |
1 | RUNNABLE | 実行中(正常) | |
2 | WAITING | 無期限で待機 | |
3 | TIMED_WAITING | 指定された待機時間で待機 | |
4 | BLOCKED | ブロック状態 | この周辺をまず調査すべき |
5 | TERMINATED | 終了 |
参考文献
http://qiita.com/strsk/items/f8cbed179dd934b0a31dhttps://helpx.adobe.com/jp/experience-manager/kb/TakeThreadDump.html
http://qiita.com/strsk/items/f8cbed179dd934b0a31d
http://etc9.hatenablog.com/entry/2015/10/11/032336
http://d.hatena.ne.jp/yohei-a/20150101/1420112104
http://www.techscore.com/blog/2016/02/05/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%80%E3%83%B3%E3%83%97%E3%81%A7%E3%83%9C%E3%83%88%E3%83%AB%E3%83%8D%E3%83%83%E3%82%AF%E3%82%92%E8%AA%BF%E6%9F%BB%E3%81%97%E3%82%88%E3%81%86/
jcmd
http://cco.hatenablog.jp/entry/2013/05/20/223212
http://qiita.com/hajimeni/items/c130f20ef17ce9c056e2
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/jcmd.html
今後役に立ちそうなサイト
ダンプ解析仕方http://kitaru.hatenadiary.com/entry/2014/09/03/Java%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8C%E6%9A%B4%E8%B5%B0%E3%81%97%E3%81%A6CPU%E3%81%8C%E6%AD%BB%E3%82%93%E3%81%A0%E6%99%82%E3%81%AB%E3%82%84%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8
より抜粋 ざっくりの流れ CPUに負荷かけてるプロセスの確認 スレッドダンプの採取 CPUに負荷かけてるスレッドの特定 スタックトレース読んで分析する