プログラミング

Javaプログラムのハングアップ(応答なし)の調査ツール jstack/jps

*記事内に商品プロモーションを含む場合があります

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つのスレッドでロックを確保して待っています。

Java stack information for the threads listed above:
===============================================
“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

jstatによるヒープメモリ/GCの確認。Javaのメモリ使用量を分析して性能改善する方法Javaで作成したプログラムのメモリ使用量の調査方法や、性能改善のポイントを紹介します。 WindowsでもLinuxどちらでも使...
Windows Java環境構築(JDKインストール)Javaでプログラム開発を行うには、JDKのインストールが必要です。 JDKとはJava Development Kitの略称です...
CentOS_java-yumインストール
CentOSにJava(openJDK)をyumでインストールする手順と複数バージョンの切り替え方法CentOS に yumで Java 8(openJDK) をインストールする手順と複数バージョンの切り替え方法について説明します。 ...