これは非常に混乱するトピックのようです。
documentation of the java
launcherを指定:
を-Xrs
オプションを使用すると、JVMは、それがために見たりプロセスCTRL_C_EVENT
、CTRL_CLOSE_EVENT
、CTRL_LOGOFF_EVENT
、またはCTRL_SHUTDOWN_EVENT
ていないことを意味し、コンソールコントロールハンドラをインストールしません。
CTRL_BREAK_EVENT
はリストに含まれていません。したがって、このオプションの影響を実際に受けませんが、ドキュメントでは-Xrs
を指定すると、この機能にまったく影響を受けない場合、「Ctrl + Breakスレッドダンプは利用できません。」となります。
さらに、この意味合いは、読者が期待するものとはまったく反対です。 JVMが-Xrs
オプションのためにこれらのイベントをリッスンしない場合、JVMはそれらをJavaサイドハンドラに転送することはできません。つまり、ではなく、がサポートされています。これは、そのオプションの影響を受けるシグナルのシグナルハンドラをインストールしようとすると簡単にテストできます。-Xrs
がでない場合にのみが指定されている場合にのみ動作します。 the code that tries to install a signal handlerを調べて
:
long oldH = handle0(sig.number, newH);
if (oldH == -1) {
throw new IllegalArgumentException
("Signal already used by VM or OS: " + sig);
}
私たちは、障害のすべての種類の一般的な答えは-1
であることがわかり、私たちはあまりにも文字通りない「信号がすでにVMやOSによって使用される」例外メッセージを取る必要があります。この場所では、「ハンドブックをインストールできませんでした。なぜなら、JVMは-Xrs
オプションのためにそのような種類のハンドラをインストールしないためです」というさまざまな理由を報告する余地はありません。
限り私は理解されるように、-Xrs
オプションは、JVMは、Java側sun.misc.Signal
処理するための信号を利用可能にしないように、干渉することなく、低レベルの信号のためのハンドラをインストールするネイティブコードを可能にするようになっています。
SIGTERM
の問題に関しては、ドキュメント全体が現実と同期していないようです。私のテスト時点で、-Xrs
を指定した最後のJVMは、CTRL + BREAKスレッドダンプは利用できませんでした。Java 6でした。しかし、上で説明したように、シグナルがネイティブコードで利用可能であり、そのようなハンドラが存在しない場合にはアボートを引き起こし、sun.misc.Signal
に利用可能にすることはできません。そのJVMの下でも、-Xrs
オプションが存在するかどうかにかかわらず、SIGBREAK
にSignalHandler
をインストールすることは不可能でした。