ハングのデバッグ

ハングは、待機 (デッドロックとも言います) またはループ (ライブロックとも言います) によって引き起こされます。 デッドロックは、ロックまたはモニターの待機が原因で発生することがあります。 ループは、同様の原因のほか、アルゴリズムがほとんどまたはまったく進行せず、完了しないことが原因で発生することがあります。

待機は、タイミング・エラーによって通知が行われないか、リソースに対して 2 つのスレッドがデッドロック状態にあることが原因で発生する可能性があります。

デッドロックの説明、および Javadump を使用したデッドロックの診断については、 LOCKS を参照してください。

ループは、スレッドが適切なタイミングでループを終了できないことが原因で引き起こされます。 この問題が起こる理由としては、スレッドが算出したしきい値が誤っていたことや、ループを終了することを目的としたフラグがなかったことなどが考えられます。 この問題がマルチプロセッサー・ワークステーションのみで発生した場合、障害の原因は通常以下のいずれかに特定されます。
  • フラグを volatile にできない。
  • 該当するモニターの使用中にフラグへアクセスできない。
待機およびループを解決する際には、以下の方法が役立ちます。
  • プロセスおよびシステム状態のモニター (「 MustGather information for Linux」を参照)。
  • Javadump により、モニターおよびロックに関する情報を取得する。 kill -QUIT <PID>コマンドでハング中にJavadumpをトリガーできます。
  • -verbose:gc情報が役立ちます。 以下が示されます:
    • 過剰なガーベッジ・コレクション。Java™ ヒープ・スペースの不足が原因で、システムがライブ・ロックされているように見えます。
    • 後のハングの原因となるハングまたはメモリー破損を引き起こしたガーベッジ・コレクション。