Interstage Application Server チューニングガイド |
目次 索引 |
第7章 JDK/JREのチューニング | > 7.2 FJVM |
Javaプロセスが不当なメモリアクセスにより異常終了した場合の原因の1つとして、スレッドに対するスタックのサイズ不足、すなわちスタックオーバーフローの発生が考えられます。
FJVMでは、スタックオーバーフローが原因と考えられる不当なメモリアクセスによりJavaプロセスが異常終了した場合、その旨を原因調査情報としてFJVMログへ出力する機能を、「スタックオーバーフロー検出時のメッセージ出力機能」として実装しています。
FJVMログの見方については、“FJVMログ”を参照してください。
スタックオーバーフロー発生の原因が、Java APIで生成されたスレッドに対するスタックのサイズにある場合は、“スタックのチューニング”を参照して、Java APIで生成されるスレッドに対するスタックのサイズをチューニングしてください。
検出対象となるスレッド
本機能でスタックオーバーフロー検出の対象となるスレッドは、Java APIで生成されたスレッドです。
次のスレッドは、本機能による検出対象スレッドとはなりません。
- ネイティブモジュールからOSのAPIを直接使用して生成されたスレッド
- mainメソッドを実行するスレッド(Java APIで生成されたスレッドではないため)
スタックオーバフローの検出には、OSの機能を利用しています。ご使用中のOSがWindowsの場合は、上記スレッドの場合であっても、そのスレッドで実行されるJavaメソッドの中から呼び出されたネイティブメソッド内で直接発生したスタックオーバーフローについては、本機能による検出対象となります。
注意事項
スタックオーバーフローが発生しても、OS側からFJVM側の処理へ制御が渡らないことがあります。その場合はFJVMログが出力されません。
OSの制御処理がワトソン博士へ直接例外制御を渡した場合には、ワトソン博士が出力するログファイルを確認してください。ワトソン博士の説明は、“クラッシュダンプ”を参照してください。
なお、スタックオーバーフロー発生時のスタック残量が少ない場合には、以下の状態でJavaアプリケーションが終了する場合があるので注意してください。
- 以下のメッセージが標準出力へ出力されただけで、FJVMログが出力されないままJavaアプリケーションが終了してしまうことがあります。
スタックオーバーフロー検出に関するFJVMログが出力されない場合であっても、以下のメッセージが出力された場合は、スタックオーバーフローが発生したことを示します。
An unrecoverable stack overflow has occurred.
または、
Register stack overflow, addr:??, stack_base:??
(??=16進数) [Windows Server(R) 2003 for Itanium-based Systemsの場合のみ]
- スタックオーバーフロー発生例外に対する制御が、OS側からFJVM側の処理およびワトソン博士のどちらにも渡らず、そのままJavaアプリケーションが終了してしまうことがあります。
その場合は、スタックオーバーフロー発生を検出することができません。
JDK/JRE 1.3における注意事項
本機能を有効とするためには、新たにJava VMが管理するスレッドをLWPに結びつけて結合ユーザスレッドにする必要があります。結合ユーザスレッドを使用すると従来よりもシステム資源を多く使用するため、本機能を有効としたJDK/JRE 1.3のFJVMを使用して多量のスレッドを用いるような既存処理をシステム移行/実行する場合には、システム性能やシステム資源量などに影響がでる可能性も考えられます。そのため、JDK/JRE 1.3のFJVMでは、本機能を標準では有効にしていません。
JDK/JRE 1.3のFJVMを使用した既存処理において本機能を使用する場合には、システム性能やシステム資源量などの検証を行ってから使用するようにしてください(特に多量のスレッドを用いるようなJavaアプリケーションの場合)。
なお、JDK/JRE 1.3のFJVMでスタックオーバーフロー検出時のメッセージ出力機能を有効とする場合には、図1のオプションを指定します。
図1 スタックオーバーフロー検出時のメッセージ出力機能を有効にするオプション
-XX:+DetectStackOverFlow
RHEL-AS4(IPF)における注意事項
RHEL-AS4(IPF)用のネイティブモジュールにおいて、メモリアクセスを伴わない再帰処理(例:スタックポインタの更新処理だけが行われるような再帰処理)でスタックオーバーフローが発生した場合には、OS側からFJVM側の処理へ正しく制御が渡りません。その場合は、スタックオーバーフロー発生を検出することができません。
目次 索引 |