StackOverflowErrorがスローされた場合、スタックオーバーフローが原因です。
スタックのサイズをチューニングしてください。
スタックのチューニング方法は、“9.4.2 スタックのチューニング”を参照してください。
なお、StackOverflowErrorがスローされず、そのままJavaプロセスが異常終了する場合もあります。
その場合の解析方法については、“9.6.3.1 スタックオーバーフロー検出時のメッセージ出力機能”を参照してください。
Javaプロセスが不当なメモリアクセスにより異常終了した場合の原因の1つとして、スレッドに対するスタックのサイズ不足、すなわちスタックオーバーフローの発生が考えられます。
FJVMでは、スタックオーバーフローが原因と考えられる不当なメモリアクセスによりJavaプロセスが異常終了した場合、その旨を原因調査情報としてFJVMログへ出力する機能を、「スタックオーバーフロー検出時のメッセージ出力機能」として実装しています。
FJVMログの見方については、“9.5.8 FJVMログ”を参照してください。
スタックオーバーフロー発生の原因が、Java APIで生成されたスレッドに対するスタックのサイズにある場合は、“9.4.2 スタックのチューニング”を参照して、Java APIで生成されるスレッドに対するスタックのサイズをチューニングしてください。
注意
検出対象となるスレッド
本機能でスタックオーバーフローの検出対象となるスレッドは、原則Java APIで生成されたスレッドです。
次のスレッドは、本機能による検出対象スレッドとはなりません。
ネイティブモジュールからOSのAPIを直接使用して生成されたスレッド
mainメソッドを実行するスレッド(Java APIで生成されたスレッドではないため)
スタックオーバフローの検出には、OSの機能を利用しています。ご使用中のOSがWindowsの場合は、上記スレッドの場合であっても、そのスレッドで実行されるJavaメソッドの中から呼び出されたネイティブメソッド内で直接発生したスタックオーバーフローについては、本機能による検出の対象となります。
注意
スタックオーバーフローが発生しても、OS側からFJVM側の処理へ制御が渡らないことがあります。その場合はFJVMログが出力されません。
OSの制御処理がWindowsエラー報告(Windows Error Reporting(WER))へ直接例外制御を渡した場合には、Windowsエラー報告が出力するログファイルを確認してください。Windowsエラー報告の説明は、“9.5.9.1 クラッシュダンプ”を参照してください。
なお、スタックオーバーフロー発生時のスタック残量が少ない場合には、以下の状態でJavaアプリケーションが終了する場合があるので注意してください。
以下のメッセージが標準出力へ出力されただけで、FJVMログが出力されないままJavaアプリケーションが終了してしまうことがあります。
スタックオーバーフロー検出に関するFJVMログが出力されない場合であっても、以下のメッセージが出力された場合は、スタックオーバーフローが発生したことを示します。
An unrecoverable stack overflow has occurred. |
スタックオーバーフロー発生例外に対する制御が、OS側からFJVM側の処理およびWindowsエラー報告(Windows Error Reporting(WER))のどちらにも渡らず、そのままJavaアプリケーションが終了してしまうことがあります。
その場合は、スタックオーバーフロー発生を検出することができません。