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

前に、コマンドだけで見つけるやり方を書いたのですが、このやり方だと瞬間的なデータしか取得できません。そこで ThreadMXBean にある getThreadCpuTime メソッドを使う方法を試してみました。このメソッドは指定したスレッドの合計 CPU 時間を返してくれるので、CPU 時間を2回取得し、その間の時間で割れば、平均 CPU 使用率を得ることができます。10秒間で95%以上使っているスレッドを検知するみたいな使い方ができそうです。

コードはこんな感じになりました。

process メソッドの中で、前回 process メソッドが呼ばれた時からの CPU 使用率の平均を求めて、threshold 以上だった場合に、handle メソッドを呼び出してくれます。maxDepth は取得するスタックトレースの深さを指定する変数です。

デフォルトでは、このクラスがロードされている JVM のスレッドを監視しますが、JMX で接続すればリモートの JVM にもアタッチできます。Maven Tomcat Plugin などでサクッとテストする場合には MAVEN_OPTS に以下のパラメータを指定すれば JMX を受け付けてくれるようになります。

  • -Dcom.sun.management.jmxremote
  • -Dcom.sun.management.jmxremote.port=<port番号>
  • -Dcom.sun.management.jmxremote.ssl=false
  • -Dcom.sun.management.jmxremote.authenticate=false