【Java】 スレッドダンプ / リソース監視・確認コマンド ~ jps / jcmd / jstack ~

スレッドダンプ とは?

 * 全スレッドのスタックトレース

取得するタイミング

[1] プログラムが遅い、フリーズした場合
[2] クラッシュした場合

スレッドダンプ取得方法

概要

[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

補足 : JCMDコマンドについて

* GCを起動させる
jcmd 【プロセスID】 GC.run

スレッドダンプを取得する際の注意点

[1] 一定の間隔で スレッドダンプを複数取得する(例:10 秒ごとに 1 つのスレッドダンプ)
 Case A : 全スレッドの状態遷移がない => ハング
 Case B : スレッド処理が進んでいる => 遅い

スレッドの状態

java.lang.Thread.State: WAITING (on object monitor)
                        ~~~~~~~
みたいな形で、スレッドの状態がわかる
`#`状態`意味`備考
1RUNNABLE実行中(正常)
2WAITING無期限で待機
3TIMED_WAITING指定された待機時間で待機
4BLOCKEDブロック状態この周辺をまず調査すべき
5TERMINATED終了

参考文献

http://qiita.com/strsk/items/f8cbed179dd934b0a31d
https://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に負荷かけてるスレッドの特定
スタックトレース読んで分析する