本節では、Javaプロセスが残っているにもかかわらず、プログラムが無応答になった場合、考えられる原因とその対処方法を説明します。
想定される原因(デッドロック)
デッドロックが発生した場合、そのスレッドが停止されます。
ハングアップしたときに、スレッドダンプを採取して、デッドロックがないかどうかを確認してください。
スレッドダンプの採取方法および解析方法の詳細は、“8.5.3 スレッドダンプ”を参照してください。
想定される原因(ガーベジコレクション)
ガーベジコレクションが発生すると、ガーベジコレクションが終了するまでの間、Javaアプリケーションのすべてのスレッドが停止されます。
これにより、Javaアプリケーションがハングアップしたかのように見える場合があります。
ガーベジコレクションのログを採取して、ガーベジコレクションが動作したタイミングを照合してください。ガーベジコレクションが原因で無応答のような現象になる場合は、Javaヒープをチューニングして、ガーベジコレクションの動作具合を改善してください。
ガーベジコレクションのログを採取する方法は、“8.2.6 ガーベジコレクションのログ出力”を参照してください。
Javaヒープのチューニング方法は、“8.4.1 Javaヒープのチューニング”を参照してください。
想定される原因(JNI処理の異常)
JNI経由でJava以外の言語で開発したネイティブモジュールと連携する際、JNIの使用方法を誤ると、ハングアップの原因となります。
このようなときは、“-Xcheck:jni”オプションを指定して、JNI処理でメッセージが出力されないかどうかを確認してください。“-Xcheck:jni”オプションの詳細は、“8.5.10 JNI処理異常時のメッセージ出力”を参照してください。
JNI処理に誤りがなくても、JNIモジュールで異常終了またハングアップが発生すると、Javaアプリケーションがハングアップする場合があります。たとえば、スレッドアンセーフな関数を使用している場合は、注意が必要です。
スレッドアンセーフな関数の例
次の関数を使用したときに、ハングした事例があります。
vfork