本節では、何の痕跡も残さずに突然プロセスが消滅した場合に、考えられる原因とその対処方法を説明します。
想定される原因(スタックオーバーフロー)
FJVMには、スタックオーバーフロー検出時にメッセージを出力する機能を備えています。FJVMログを分析することにより、スタックオーバーフローが発生したかどうかを確認することができます。FJVMログの分析方法は、“8.6.3.1 スタックオーバーフロー検出時のメッセージ出力機能”を参照してください。
スタックオーバーフローが発生したことを確認できた場合、該当するスタックのサイズをチューニングしてください。スタックのチューニング方法は、“8.4.2 スタックのチューニング”を参照してください。
通常、スタックオーバーフローが発生した場合、java.lang.StackOverflowErrorがスローされ、ワトソン博士が検知してユーザダンプおよびワトソンログを出力します。
しかし、OSが高負荷状態になったり、スタックオーバーフロー発生時のスタック残量が少なかったりすると、OSからFJVMにもワトソン博士にも制御が渡らないまま、痕跡を残さずにプロセスが消滅することがあります。
したがって、プロセスが消滅した原因が不明な場合は、スタックのサイズを拡張して、現象が改善できるかどうかを確認してください。スタックのサイズを拡張しても改善できない場合は、別の原因を調査してください。
なお、ワトソン博士の説明は、“8.5.9.1 クラッシュダンプ”を参照してください。
想定される原因(長時間コンパイル処理の検出機能による終了)
FJVMの“長時間コンパイル処理の検出機能”による終了の可能性があります。
詳細は、“8.3.2 長時間コンパイル処理の検出機能”を参照してください。
Javaアプリケーションを“-XX:CompileTimeout”オプション付きで起動した場合は、標準出力にFJVMからのメッセージが出力されていないかどうかを確認してください。
想定される原因(シグナルハンドラ)
Java VM以外のモジュールで、シグナルハンドラを登録した場合、Javaアプリケーションが正常に動作せずに、異常終了することがあります。詳細は、“8.5.8.2 異常終了時のシグナルハンドラ情報 ”を参照してください。
FJVMを使用している場合は、FJVMログにシグナルハンドラ情報が出力されますので、それを確認してください。
想定される原因(JNI処理の異常)
JNI経由でJava以外の言語で開発したネイティブモジュールと連携する際、JNIの使用方法を誤ると、プロセス消滅の原因となります。
このようなときは、“-Xcheck:jni”オプションを指定して、JNI処理でメッセージが出力されないかどうかを確認してください。“-Xcheck:jni”オプションの詳細は、“8.5.10 JNI処理異常時のメッセージ出力”を参照してください。
JNI処理に誤りがなくても、ネイティブモジュールで異常終了またハングアップが発生すると、Javaアプリケーションのプロセスが消滅する場合があります。たとえば、スレッドアンセーフな関数を使用している場合は、注意が必要です。
スレッドアンセーフな関数の例
次の関数を使用したときに、障害が発生した事例があります。
vfork
想定される原因(プログラムによる終了)
Javaプロセスが、特別なメッセージ出力などがないまま、予想外の状態で終了した場合、原因の1つとして、次のいずれかが考えられます。
java.lang.Runtime.exit()を予想外の箇所で実行した
java.lang.Runtime.halt()を予想外の箇所で実行した
java.lang.System.exit()を予想外の箇所で実行した
FJVMを使用している場合は、“8.5.6 Java VM終了時における状態情報のメッセージ出力機能”を参照して、対処してください。
想定される原因(Windows Server(R) 2003の問題)
Windows Server(R) 2003の初期版においては、ユーザダンプが出力されない問題をはじめとして、その他にもJavaの実行動作に影響を及ぼす問題などがあります。
たとえば、次のような問題があります。
http://support.microsoft.com/kb/836080/en-us
http://support.microsoft.com/kb/837018/en-us
http://support.microsoft.com/kb/841176/en-us
Windows Server(R) 2003を使用する場合は、Service Pack 1以降またはHotfixを適用してください。