jvmの実行中スタックトレースを取得する


2011年 03月 17日

Javaのプログラムを実行した際、なんらかしらのバグや高負荷によりハングアップのような状態になることがあります。そうした際、jvmのスタックトレースを見ることでどこの処理まで到達しているか、またどの辺りでとまっているかを調査することが可能となります。

では、どのようにすればjvmで実行中のプログラムのスタックトレースを取得できるのでしょうか。
答えはいたって簡単で、jstackを実行すればよいのです。

jstackはJDKインストール時に$JAVA_HOME/bin/jstack に置かれます。JREには含まれないので注意です。
実行方法は
$ jstack <pid>
です。
JavaSEのサイトに詳しい説明があるので、オプションなどはそちらを参考にしてください。扱いとして「試験的」となっているので、今使えるといって今後も使えるかはわからないので注意してください。


実行中のjvmのプロセスIDがわからない場合は、
$ jps
とコマンドを実行することで、実行中のJavaVMのプロセスID(pid)がわかります。

jstackを実行することで動作中のJavaVMが停止することは無いので、安心して使ってみてください。

このほかにもJDKにはいくつもの開発(やデバッグ、運用など)を手助けするツール類が含まれています。すぐに使うわけではなくとも、目を通しておくとよいかもしれません。いつか役に立つことがあるでしょう。