Java HotSpot VMは、様々な機能を実装して致命的エラー状態に対処するために、シグナル・ハンドラをインストールします。たとえば、まれにjava.lang.NullPointerException
がスローされた場合に明示的なNULLチェックを回避する最適化では、SIGSEGV
シグナルをキャッチして処理し、NullPointerException
をスローします。
一般に、シグナルやトラップが発生する状況には2つのカテゴリがあります。
前述の暗黙的なNULL処理のような、シグナルが予想され処理される場合。もう1つの例として、セーフポイントが必要になったときにメモリー内のページを保護する、セーフポイント・ポーリング・メカニズムがあります。そのページにアクセスするスレッドによってSIGSEGV
が生成され、その結果、スレッドをセーフポイントに移行させるスタブが実行されます。
予期しないシグナル。これには、VMコード、Java Native Interface (JNI)コード、またはネイティブ・コードで実行されたときのSIGSEGV
が含まれます。これらの場合、このシグナルは予想されていないため、エラー・ログを作成してプロセスを終了するために致命的エラー処理が呼び出されます。
表7-2に、Oracle SolarisおよびLinuxオペレーティング・システムで現在使用されているシグナルの一覧を示します。