Java の基礎: スレッドおよびスレッド・スタック照会

Java™ スレッドおよびスレッド・スタック・フレームを検査するための照会を実行できます。

スレッド照会

以下の照会を使用すると、スナップショットが作成された時点の Java スレッドに関する情報を表示できます。
スレッドの概要とスタック
この照会は、各スレッドの名前、オブジェクト、コンテキスト・クラス・ローダーを含む、ヒープ内のすべてのスレッドの概要を表示するために使用します。使用可能な場合、この照会では、スレッドの呼び出しスタックに関する情報、および各スタック・フレーム内の Java ローカル・オブジェクトに関する情報も表示されます。スタック情報を含むダンプとしては、最近の Oracle Java 6 VM からの HPROF ダンプ、および IBM システム・ダンプがあります。

呼び出しスタックおよびローカルの Java オブジェクトを分析すると、メモリーが集中的に使用される操作の原因がわかります。この機能を使用することにより、メモリー使用量に関連した問題以外の問題 (例えば、反応しないアプリケーションなど) を分析することができます。

変更の始まりこの照会は、「照会ブラウザー」メニューから実行するか、「可能な場合は、各スレッドの名前、スタック、フレーム・ローカル、保存ヒープなどを表示します。」ボタン () をクリックしてツールバーから直接実行することができます。
注: このボタンは、この製品の Web Edition では使用できません。
変更の終わり
スレッドの詳細
この照会は、詳細情報が使用可能な場合、単一スレッドをより詳しく分析するために使用します。一部のヒープ・ダンプには、スレッドに関して、「スレッドの概要とスタック」照会によって表示されるより多くの情報が含まれています。例えば、IBM システム・ダンプおよび IBM .phd ファイルから、スレッドの状態と優先順位、およびネイティブ・スタック・トレースに関する情報を取得することができます。.phd ファイルからこの情報を取得するには、.phd ファイルと同時に生成された Java ダンプ・ファイル (例えば、javacore.txt) も開く必要があります。

スレッド・スタック・フレーム

デフォルトによりスタック・フレームは、「スレッドの概要とスタック」照会を実行することによってのみ表示できます。このデフォルト動作は、スタック・フレームを疑似オブジェクトとして表示し、メソッドを疑似クラスとして表示するよう指定するように変更することができます。それにより、これらの疑似オブジェクトおよびクラスは他のビューと照会で表示され、それらを使用して、さらにスタック情報を分析することができます。この動作を変更するには、「ファイル」 > 「設定...」 > 「IBM Monitoring and Diagnostic Tools for Java - Memory Analyzer」 > 「DTFJ パーサー」をクリックします。
注: この製品の Web Edition では「設定」メニューはサポートされていないため、デフォルトの動作を変更できません。
以下のオプションのいずれかを選択して、「OK」をクリックします。
通常
このオプションがデフォルトの動作です。スタック・フレームは、「スレッドの概要とスタック」照会を実行した場合にのみ表示されます。
スタック・フレームのみを疑似オブジェクトとして処理します
スタック・フレームは、ビューおよび照会で疑似オブジェクトとして表示されます。表示されるオブジェクト・タイプは、<stack frame> です。フレームで実行されているメソッド、メソッドを含むソース・ファイル、およびソース・ファイル内でのメソッドの行番号などの項目も表示されます。例:
<Java Stack Frame> <stack frame> @ 0x11b8ec java.io.BufferedInputStream.fill()V (BufferedInputStream.java.229)
「シャロー・ヒープ」列に表示されるフレームのサイズは 0 のため、疑似オブジェクトはグローバル・ヒープ統計には影響を与えません。
注: 「サイズ」列には「シャロー・ヒープ」のラベルが付いていますが、スタック・フレームのサイズは、ヒープのサイズではなく、Java スタックのサイズです。

ローカル変数が使用されている箇所を調べるには、このオプションを選択します。各スタック・フレーム内のローカル変数参照は、フレームからのアウトバウンド参照として表示されます。このため、これらのローカル変数参照を使用してオブジェクトへのパス、またはオブジェクトからのパスを分析することにより、オブジェクトを存続させているスタック・フレームを見つけることができます。例えば、「リスト・オブジェクト」 > 「出力参照を使用」照会を使用して出力参照をブラウズするか、「GC ルートへのパス」照会を使用して、特定のスタック・フレームからの参照を表示します。

スタック・フレームを疑似オブジェクトとして処理し、実行中のメソッドを疑似クラスとして処理します
オブジェクト・タイプが <stack frame> ではなく、実行中のメソッドの名前であり、スタック・フレームが現在「シャロー・ヒープ」サイズを持っている点を除き、このオプションの動作は前のオプションと似ています。
<Java Stack Frame> java.io.BufferedInputStream.fill()V @ 0x11b8ec (BufferedInputStream.java.229)
さらに、実行中のメソッドは、「シャロー・ヒープ」サイズ 0 の疑似クラスとして表示されます。例えば、次のようになります。
java.io.BufferedInputStream.fill()V
このオプションは、現在すべてのスレッドにわたって実行されているメソッド、および各メソッドが消費しているスタック・スペース量を表示するために使用します。この情報は、スタック・オーバーフロー・エラーの解決に役立ちます。この情報を表示するには、「ヒストグラム」ビューを使用し、「¥(」により「クラス名」をフィルター処理します。このフィルター・ストリングは、中括弧を含む (つまりクラス名がメソッドである) クラス名に一致します。
スタック・フレームを疑似オブジェクトとして処理し、すべてのメソッドを疑似クラスとして処理します
すべてのメソッドが疑似クラス・オブジェクトとして表示され、「シャロー・ヒープ」サイズがもはや 0 でない点を除き、このオプションの動作は、前のオプションに似ています。各疑似クラス・オブジェクトのサイズは、バイトコードとジャストインタイム (JIT) コードの結合サイズです。定義しているクラスのサイズにメソッド・サイズが累算される「通常」オプションと異なり、これらのメソッド・サイズはクラス・サイズの一部ではありません。

このオプションは、バイトコードと JIT コードに多くの非ヒープ・メモリーを消費しているメソッドを見つけるために使用します。この情報を表示するには、「ヒストグラム」ビューを使用し、「¥(」により「クラス名」をフィルター処理してメソッドのみを表示し、メソッドを右クリックし、「リスト・オブジェクト」照会を選択します。



© Copyright IBM Corporation 2011, 2015.
© Copyright 2008, 2015 SAP AG and others. 本製品では Eclipse テクノロジーが採用されています。詳しくは、http://www.eclipse.org を参照してください。