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