Javaプログラムのハングアップ(応答なし)などの調査に使えるツールjstackを紹介します。
jstackの使い方
Windowsならコマンドプロンプト、Linuxならターミナルコンソールで「jps」と「jstack」コマンドを使います。
実行中のJavaプログラムのコールスタック(スタックトレース)を表示することができます。
LinuxなどのUnix系のコマンドの ps と pstack と同じですね。
対象がjavaプログラムになる違いだけです。
jpsでJavaアプリのプロセスIDを確認
引数なしで「jps」を実行すると、javaプログラムのみのプロセスIDが表示されます。
他の言語で作成されているプログラムは表示されません。
jstackでJavaアプリのスタックトレースを確認
jpsで出力されたプロセスIDを使って、「jstack プロセスID」を実行します。
ポイントを説明すると、sleepで待っています。
ソースファイルの場所はTest01.java の13行目です。
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(java.base@18/Native Method)
at Test01.lambda$main$0(Test01.java:13)
at Test01$$Lambda$1/0x0000000800c009f0.run(Unknown Source)
at java.util.concurrent.Executors$RunnableAdapter.call(java.base@18/Executors.java:539)
at java.util.concurrent.FutureTask.run(java.base@18/FutureTask.java:264)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@18/ThreadPoolExecutor.java:1136)
実行したJavaソースプログラムも載せておきます。
デッドロックも検出可能
スレッドプログラムを作成した場合に、デッドロックが発生する可能性があります。
jstackで検出可能です。
2つのスレッドでロックを確保して待っています。
===============================================
“Thread-0”:
at T1.run(DeadLock01.java:19)
– waiting to lock <0x0000000711d196c0> (a java.lang.Object)
– locked <0x0000000711d196b0> (a java.lang.Object)
at java.lang.Thread.run(java.base@18/Thread.java:833)”Thread-1″:
at T2.run(DeadLock01.java:33)
– waiting to lock <0x0000000711d196b0> (a java.lang.Object)
– locked <0x0000000711d196c0> (a java.lang.Object)
at java.lang.Thread.run(java.base@18/Thread.java:833)Found 1 deadlock.
実行したJavaソースプログラムも載せておきます。
Object A と B をたすき掛けでロックしているので、デッドロックしています。
あとがき
Javaには他にも便利なツールがありますね。
Oracleの公式サイトにJDKツールとユーティリティの説明があります。
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/index.html