スレッドダンプ
スレッドダンプは、特定の瞬間におけるアプリケーションの状態を調べるためのツールです。 アプリケーション内のスレッドのリストとスタックトレースが提供されるため、デッドロックや UI の応答なしなどの問題のデバッグに役立ちます。 スレッドダンプの主な利点は、プレーンテキスト形式であることと、それをキャプチャーして処理できるツールが多数あることです。
IntelliJ IDEA を使用すると、実行中のプロセスのスレッドダンプをキャプチャーできるほか、IntelliJ IDEA または jstack や jcmd などの別のツールで取得された外部スレッドダンプを解釈することもできます。
IntelliJ IDEA は、バージョン 25 までの JDK ツールによって生成された形式をサポートします。
IntelliJ IDEA からスレッドダンプをキャプチャーする
IntelliJ IDEA からプログラムを実行しているときに、 実行 ツールウィンドウのツールバーで、
スレッドのダンプ をクリックします。

IntelliJ IDEA からプログラムをデバッグしているときに、 デバッグ ツールウィンドウのツールバーで、
その他 をクリックし、
スレッドダンプを取得 を選択します。

ローカルで実行されている Java/Kotlin プロセスの場合: プロファイラー ツールウィンドウの ホーム タブで、スレッドダンプを作成するプロセスをクリックします。 スレッドダンプを取得 を選択します。

外部スレッドダンプを開く
開いた スタックトレースの分析 ダイアログで、スレッドダンプを スタックトレースをここに記述する: テキスト領域に貼り付けます。
スレッドダンプは新しいツールウィンドウタブで開きます。 このビューはカスタマイズ可能で、フィルターや並べ替えを適用したり、類似スレッドをマージしたり、スタックトレースを部分的に折りたたんだりできます。
スレッド名の近くにあるアイコンは、スレッドの状態を示します。
アイコン | 説明 |
|---|---|
実行中 / アクティブ – スレッドがアクティブにコードを実行しているデフォルトの状態 | |
(Kotlin コルーチンの場合)実行中 – コルーチンがコードをアクティブに実行している | |
スリープ – スレッドが | |
キャリアスレッド – 現在仮想スレッド、または 作成 / 不明状態のコルーチンを実行しているプラットフォームスレッド | |
| 待機中 – スレッドがオブジェクトモニターで待機しているとき、またはコルーチンが中断されているときに発生します |
ソケット – スレッドがネットワーク I/O を実行しているときに発生します | |
I/O – スレッドが非ネットワーク I/O 操作を実行しているときに発生します | |
| EDT(イベントディスパッチスレッド) – Swing アプリケーションの UI スレッド。 |
さらに、波状のオーバーレイは仮想スレッドと Kotlin コルーチンを示し、デーモンスレッドは「ゴースト」オーバーレイで示されます。

実行 ツールウィンドウ内の一部の呼び出しには点線の下線が表示されます。 これらの呼び出しは try ブロック内で発生し、チェック例外をスローする可能性があります。
スタックトレースに表示されるクラスをインスペクションする場合は、スレッドダンプから直接そのクラスに移動できます。
ソースに移動
スタックトレースのハイパーリンクをクリックします。

スレッドダンプを後でインスペクション用に保存したり、他の人に送信したりする場合は、テキストファイルとしてエクスポートできます。
スレッドダンプをテキストファイルとしてエクスポートする
ツールバーで、 テキストファイルにエクスポート をクリックします。

パスを指定して、 保存 をクリックします。
IntelliJ IDEA のスレッドダンプ形式
IntelliJ IDEA のスレッドダンプをテキスト形式で表示すると、スレッドの説明とスタックトレースに追加情報が表示される場合があります。
次にその例を示します。
ダンプ内の各スレッドは次の情報で表されます。
スレッドヘッダー行
スレッドヘッダー行は、すべてのスレッドの説明の先頭に配置され、次の内容で構成されます。
スレッド名は引用符で囲む
スレッドがデーモンか仮想かを示すオプションのフラグ
スレッド優先度(
prio) – JVM によって管理される値で、スレッドのスケジューリング優先度を 1(最低)から 10(最高)の範囲で示します。 デフォルト値は 5 です。 これらの優先度は OS レベルのスレッド優先度にマッピングできますが、マッピングは実装に依存し、優先度は実行順序を保証するものではなく、スケジューラへのヒントとして機能します。16 進数のスレッド ID (
tid)ネイティブ ID(
nid) – IDE 生成のダンプでは通常NAです。 この情報は通常、スレッドダンプが JVM 自体によって生成された場合にのみ利用できます。スレッドの状態。 以下の状態が認識されます。
スレッドの状態
説明
runnableスレッドはアクティブに実行中または実行準備ができています
sleepingスレッドはスリープ状態です (
Thread.sleep())waiting on conditionスレッドは条件を待機しています
waiting for monitor entryスレッドはモニターロックの取得を待機しています
sleepingスレッドはスリープ状態です (
Thread.sleep())parkingスレッドは停止しています (
LockSupport.park())on object monitorスレッドはオブジェクトモニターを待機しています
idleイベントディスパッチスレッドはアイドル状態です
スレッド状態行
スレッド状態行はスレッドヘッダー行の直後に表示され、JVM によって示されるスレッドの状態を示します。 以下の状態が考えられます。
スレッドの状態 | 説明 |
|---|---|
| まだ実行を開始していないスレッド |
| Java 仮想マシンで実行されるスレッド |
| スレッドがモニターロックを待機してブロックされました |
| 別のスレッドが特定のアクションを実行するのを無期限に待機するスレッド |
| 指定された待機時間まで別のスレッドがアクションを実行するのを待つスレッド |
| 実行を終了したスレッド |
スレッド状態の詳細については、 公式 Java ドキュメントを参照してください。
スタックトレース
スタックトレースには、スレッドのメソッド呼び出しのシーケンスが表示され、次のような特徴があります。
スタックトレースの各行はタブ文字で始まります。
メソッド呼び出しは、上 (最近呼び出されたメソッド) から下 (以前のメソッド) の順にリストされます。
各行は
at package.class.method(SourceFile:LineNumber)という形式に従います。 IntelliJ IDEA がソースファイルを認識すると、それを使って ソースコードに移動できます。
ロック情報
利用可能な場合、IntelliJ IDEA のスレッドダンプには、スレッドが保持しているロックに関する情報が含まれます:
このスレッドが所有するモニター
このスレッドによってブロックされたスレッド
このスレッドが待機しているモニター
クラスとメモリアドレスでオブジェクトをロックする
Kotlin コルーチン
Kotlin のコルーチンは、IntelliJ IDEA のスレッドダンプで Java スレッドと並べて表示できます。 例:
コルーチン情報は次のようにフォーマットされます。
名前と ID: コルーチン名の後に一意の ID が続く(例:
coroutine:1)状態: コルーチンの現在の状態(例:
SUSPENDED)ディスパッチャー: コルーチンが使用しているディスパッチャーに関する情報(例:
Dispatchers.IO)スタックトレース: コルーチンのスタックフレーム
コルーチンは次のいずれかの状態になります。
コルーチン状態 | 説明 |
|---|---|
| コルーチンは現在実行 |
| コルーチンは中断ポイントで中断されます |
| コルーチンは作成されましたが、まだ開始されていません |
| 状態は判断できません |