Javaの暴走スレッドを見つける

簡単な方法がJava Obsessionというブログで紹介されていました。

Figure out why is JAVA eating CPU?

psコマンドで、CPU使用率が高いスレッドを見つけて、jstack(もしくは kill コマンド)でスタックトレースを見つけましょうという話です。

大変わかりやすく説明してくれているのですが、若干手作業が多いので、勢いで bash スクリプトを書いてみました。

CPU使用率が95%以上のスレッドのスタックトレースを出力するスクリプトです。CPU使用率の閾値を変更したい場合は ./java-cpu-monitor.sh 99.9 のようにパラメータで渡せます。

watch コマンドと tee コマンドを組み合わせると便利ですかね?

5秒置きに cpu.log に出力する場合は

watch -n 5 './java-cpu-monitor.sh | tee -a cpu.log'

でよいかと思われます。

 

テキトーなスクリプトなので、好きに使ってください。バグがあったら教えてくれると助かります。自分でも perlpython で書けって思いましたが、スクリプト言語からコマンドを呼び出すのに抵抗があって。。