概要
Java 9 以降のコアダンプで、ハングの原因を特定する方法を紹介します。今回用いたソースコードは GitHub のサイトで確認できます。
内容
GUI ツール
1. 「jhsdb hsdb」を実行します。

2. 「File」→「Open HotSpot core file」をクリックします。

3. 「Path to core file:」にコアファイルのパスを、「Path to Java executable:」にコアダンプ作成時に使用していた Java 実行ファイルへのパスを入力します。

4. 「Tools」→「Deadlock Detection」を実行します。

5. デッドロックが表示されます。

"Thread1": waiting to lock Monitor@0x00007fe0b8008d00 (Object@0x00000000e303e498, a java/lang/String), which is held by "Thread2" "Thread2": waiting to lock Monitor@0x00007fe0b8008c00 (Object@0x00000000e303e468, a java/lang/String), which is held by "Thread1" Found a total of 1 deadlock.
|
上記の例では、
Thread1 が
Thread2 が持っているロックを持っており、また
Thread2 が
Thread1 が持っているロックを待っており、
Thread1 と
Thread2 でデッドロックが発生していることがわかります。
6. スレッドのコールスタックは、既に表示されている「Java Threads」内のスレッドを選択し「Show Java stack trace」で表示可能です。


コマンドライン
1. 「jhsdb jstack –-exe <java へのパス> –-core <コアファイル>」を実行します。

2. 「Deadlock Detection:」の部分で、デッドロックの発生を確認できます。
以下の例では、上述した GUI ツールの出力同様、Thread1 と Thread2 でデッドロックが発生していることがわかります。また、コールスタックも確認できます。

ソースコードtroushoo/deadlockjava関連記事実行中の Java のコールスタックを表示する方法
- 2018/07/22(日) 23:58:21|
- Java
-
| トラックバック:0
-
| コメント:0