Java VMはJavaアプリケーションとして実行されるJavaメソッドに対して必要に応じて自動的にコンパイル処理を行いますが、コンパイル処理を行っている際にコンパイラ内で何らかの異常が発生すると、当該Javaメソッドに対するコンパイル処理だけでなくJava VMとしての動作も異常状態として停止させてしまう場合があります。
FJVMでは、コンパイラ内で何らかの異常が発生した場合に自動的にリカバリ処理を行い、Java VMとしての動作を継続させる機能を「コンパイラ異常発生時の自動リカバリ機能」として実装しています。
なお、本機能によるリカバリ処理が行なわれた際にコンパイル対象となっていたJavaメソッドは、以降、コンパイル処理の対象とはなりません。当該Javaメソッドについてはコンパイルされず、インタプリタモードのままJavaアプリケーションとしての実行が継続されます。
また、本機能はFJVMの内部処理として動作する機能であるため、コンパイラ内で何らかの異常が発生してもリカバリ処理が正常に行われた場合には、外部に対する通知などは何も行いません。リカバリ処理が正常に行われた場合でもコンパイラ内で何らかの異常が発生したことを情報として受け取る場合には、図1のオプションを指定してください。
図1のオプションを指定した場合、リカバリ処理の情報が図2の形式で標準出力に出力されます。
図1 リカバリ処理実施後に通知を受け取るオプション
-XX:+PrintCompilerRecoveryMessage |
図2 リカバリ処理実施後に通知される情報
【JDK/JRE 1.4の場合】
CompilerRecovery: Information: The compilation order was canceled in compiling method method_name |
【JDK/JRE 5.0または6場合】
CompilerRecovery: Information:The compilation was canceled for method method_name |
method_name: | コンパイル処理で異常が発生した際にコンパイル対象となっていたJavaメソッドの名前。 |
reason: | コンパイル処理で発生した異常の原因情報。原因情報として以下の項目があります。 |
| |
c: | 異常コード。 |
xxxxxxxx: | コンパイル処理で異常が発生した際のアドレス。 |
Windows Server(R) for Itanium-based Systemsでの注意事項
コンパイル処理でスタックオーバーフローが発生した場合、その発生例外に対する制御がOS側からFJVM側の処理へ渡らず、そのままJavaアプリケーションが終了してしまうことがあります。
その場合は、本機能によるリカバリ処理は行われません。
なおその際、以下のメッセージが標準出力へ出力される場合があります。
An unrecoverable stack overflow has occurred. (compiler thread) |