来自IBM:
-Xrs
禁用JVM中的信号处理.
-Xrs
设置-Xrs可防止Java™运行时环境处理任何内部或外部生成的信号,如SIGSEGV和SIGABRT.引发的任何信号都由默认的操作系统处理程序处理.在JVM中禁用信号处理会使性能降低大约2-4%,具体取决于应用程序.
-Xrs:同步
在UNIX系统上,此选项禁用JVM中用于SIGSEGV,SIGFPE,SIGBUS,SIGILL,SIGTRAP和SIGABRT信号的信号处理.但是,JVM仍然处理SIGQUIT和SIGTERM信号等.与-Xrs一样,使用-Xrs:sync可将性能降低约2-4%,具体取决于应用程序.
注意:设置此选项可防止JVM为SIGSEGV和SIGABRT等信号生成转储,因为JVM不再拦截这些信号.
根据我的理解,-Xrs实际上用于防止在截获某些OS信号时生成转储.
由于JVM不再截获和处理这些信号,它会站在原因,这会提高性能,而不是减少,如权利由IBM了.
为什么-Xrs降低性能?
chr*_*ke- 14
由于安全点和VM操作,以及JIT在允许它管理信号时可以执行的其他优化.
JVM偶尔必须执行一些操作,要求它全局暂停执行("停止世界"),例如某些大规模垃圾收集,热重新加载或内部重新编译类等.为了做到这一点,它必须确保所有正在运行的线程都碰到障碍并同时暂停,执行操作,然后释放线程.
HotSpot(以及可能的其他JVM)用于实现安全点的一种技术是巧妙滥用段错误:它设置一个实际上不用于任何数据的内存页,然后每个线程周期性地尝试从该页读取.当不需要VM操作时,读取成功且开销非常低,并且线程继续运行.
当JVM 确实需要执行VM操作时,它会使该内存页无效.下一次每个线程点击一个安全点时,它现在会导致一个段错误,让JVM重新获得对该线程执行的控制权; 它一直保持到VM操作完成,重置sentinel页面,并重新启动所有线程.
当您禁用SIGSEGV处理时,JVM必须使用其他技术来同步安全点,这些安全点的效率低于委派给处理器的内置内存保护.
此外,JVM通过分析(与CPU的分支预测器类似)做了一些重要的魔术.它使用的一个优化是,如果它检测到某个空检查几乎从不为null,它就会省略检查并依赖于段错误(代价很高,但在这种情况下很少见)来捕获空值.此优化还需要自定义处理SIGSEGV.
除了@chrylis提到的安全点之外,segfault处理程序也用于其他聪明的优化技巧,例如隐式空指针检查(至少它们在热点上).如果配置文件显示很少触发空检查代码路径,则会对其进行优化,然后由信号处理程序覆盖不太可能的情况.
如果不安装自定义信号处理程序,则无法执行此类优化.