troushoo

Java 9 以降のコアダンプで、ハングの原因を特定

概要

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.


上記の例では、Thread1Thread2 が持っているロックを持っており、また Thread2Thread1 が持っているロックを待っており、Thread1Thread2 でデッドロックが発生していることがわかります。

6. スレッドのコールスタックは、既に表示されている「Java Threads」内のスレッドを選択し「Show Java stack trace」で表示可能です。



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


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


ソースコード
troushoo/deadlockjava

関連記事
実行中の Java のコールスタックを表示する方法
  1. 2018/07/22(日) 23:58:21|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
<<WMI トレースの有効化 | ホーム | Wireshark を用いて Apache との SSL / TLS 通信を復号>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
https://troushoo.blog.fc2.com/tb.php/363-612ace08
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (114)
ネットワーク (54)
Wireshark (48)
AD (36)
Linux (45)
WinDbg (46)
SOS・Psscor2/Psscor4 (25)
Visual Studio (56)
Tips (32)
コンテナ (4)
Azure (17)
.NET (24)
Python (9)
Java (5)
SQL (6)
事例 (1)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する