Java Platform, Standard Editionトラブルシューティング・ガイド
目次      

6.1 ループ処理の診断

VMプロセスがループしているように見える場合、最初の手順はスレッド・ダンプを取得しようとすることです。スレッド・ダンプを取得できれば、多くの場合、どのスレッドがループしているかがはっきりします。ループしているスレッドを識別できたら、スレッド・ダンプ内のトレース・スタックから、そのスレッドがループしている場所(および場合によっては理由)に関する手掛かりを得ることができます。

アプリケーション・コンソール(標準入力/出力)を使用できる場合は、[Ctrl]+[\]キーの組合せ(Oracle SolarisまたはLinuxの場合)または[Ctrl]+[Break]キーの組合せ(Windowsの場合)を押して、HotSpot VMにスレッドの状態を含むスレッド・ダンプを出力させることができます。Oracle SolarisおよびLinuxオペレーティング・システムでは、SIGQUITをプロセスに送信(コマンドkill -QUIT pid)してもスレッド・ダンプを取得できます。この場合、スレッド・ダンプはターゲット・プロセスの標準出力に出力されます。プロセスの起動方法によっては、出力をファイルに送信することもできます。

-XX:+PrintClassHistogramコマンド行オプションを指定してJavaプロセスを起動すると、Ctrl+Breakハンドラによってヒープ・ヒストグラムが生成されます。

スレッド・ダンプを取得できる場合は、RUNNABLE状態のスレッドのスレッド・スタックから始めるのが適切です。スレッド・ダンプの形式の詳細、およびスレッド・ダンプ内の可能なスレッド状態の表は、「スレッド・ダンプ」を参照してください。場合によっては、どのスレッドが継続的にビジーに見えるかを特定するため、スレッド・ダンプを連続して取得する必要がある場合があります。

アプリケーション・コンソールを使用できない(プロセスがバックグラウンドで実行されていたり、VMの出力が未知の場所に送信されていたりするなど)場合は、jstackユーティリティを使用してスタック・スレッドを取得できます。ループしているプロセスのスタック・ダンプを強制するには、jstack -F pidコマンドを使用します。このユーティリティの出力については、「jstackユーティリティ」を参照してください。Javaスレッドがループしている証拠がスレッド・ダンプに示されない場合も、jstackユーティリティを使用するようにしてください。

jstackユーティリティの出力を確認するときは、まずRUNNABLE状態のスレッドに注目してください。これは、ビジー状態でループしていると思われるスレッドが取る可能性がもっとも高い状態です。場合によっては、どのスレッドがループしているかを完全に把握するために、jstackを数回にわたって実行する必要があります。スレッドが常にRUNNABLE状態であるように見える場合は、-mオプションを使用してネイティブ・フレームを出力し、スレッドが実行している処理について詳細なヒントを得ることができます。スレッドがRUNNABLE状態のままで継続的にループしているように見える場合、この状況はより詳しい調査を必要とする潜在的HotSpot VMバグを示している可能性があります。

VMが[Ctrl]+[\]に応答しない場合、これはアプリケーション・コードやライブラリ・コードの問題ではなく、VMのバグを示している可能性があります。この場合は、(-Fオプションに加えて) -mオプションを指定したjstackを使用して、すべてのスレッドのスレッド・スタックを取得します。この出力には、VM内部のスレッドのスレッド・スタックが含まれます。このスタック・トレースで、待機しているように見えないスレッドを識別します。たとえばOracle Solarisオペレーティング・システムでは、__lwp_cond_wait__lwp_park___pollsysなどの関数、または他のブロック関数に入っていないスレッドを識別します。VMのバグによってループが発生しているように見える場合は、できるだけ多くのデータを収集して、バグ・レポートを提出してください。データ収集の詳細は、「バグ・レポートの提出」を参照してください。

目次      

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.