JREでアプリを動かしてるWindowsサーバで、スレッドダンプを取得する要件が発生した。
考えること、多い
- JDKなら普通に取れるけど、JREだとjstackは存在しないので、JDKインストールしないといけない?
- JREで動いてるアプリを、別のパスでインストールしたJDKでスレッドダンプ取れんのか?
- アプリをJDKで動かさないといけないんじゃ?
- JREはそのままにしてJDKを追加でインストールする? Pathとか気を付けないと
- JREとJDKはver合わせないとだよね
色々わからないので、ためしにどういうエラーメッセージでるのかなーと、適当なJDKダウンロードしてきて、適当なJavaアプリにjstack仕掛けてみる
と思ったが、適当なJavaアプリがないので、EclipseがJavaで動いてることを思い出して、試しにEclipse (eclipse.exe) にやってみる
動いた
(スレッドダンプ取れた)
↑見出しの間違った使い方 (でかい文字にしたかったが方法がこれしかない残念)
eclipse.exeがどのverのどういうJava実行環境なのか全然知らないが、これで分かった
jstackは適当でも全然動く
jstackと取得対象のjavaとで、パスとかverとか違っても全然大丈夫だ
次に本番での取得を想定して検証してく
- JREでアプリが動いてる社内サーバに
- 同じverのJDKをダウンロードしてきてインストールして
- コマンドプロンプトでJDKにpathを通して、JREアプリに対してスレッドダンプ取得
これもOK
じゃさらにつっこんで、jstack.exeとライブラリだけコピって実行できるか試してみる
- JREのbinに、JDKのbinのjstack.exeをコピー
- JREのlibに、JDKのlibのtools.jarをコピー
- JREのbinにコピーしたjstackでJREで動かしてるアプリにスレッドダンプ取得
- エラー
java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider: Provider sun.tools.attach.WindowsAttachProvider could not be instantiated
1548: no providers installed
(すいません、最初の投稿でいけたと書きましたが、あとからやり直してみるとやっぱだめでした)
ということで、JDKのインストールは必要なものの、jstackさんであれば、JRE相手でも簡単にスレッドダンプが取れることが分かりました
(備考)
- そもそも最初からJDK使えばいんだけどね..
- コマンドはこれだけ
jstack -l <PID>
- tools.jarを配置しないとこんなエラーがでた
- ここにでてるメッセージでlibをあさったらtoolsってのがあったので、置いたら次に進んだ(雑)
エラー: メイン・クラスsun.tools.jstack.JStackが見つからなかったかロードできませんでした
おしまい