为什么-Xrs会降低性能

Sna*_*Doc 10 java jvm

来自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不再拦截这些信号.

https://www-01.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.aix.70.doc/diag/appendixes/cmdline/Xrs.html

根据我的理解,-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.


the*_*472 5

除了@chrylis提到的安全点之外,segfault处理程序也用于其他聪明的优化技巧,例如隐式空指针检查(至少它们在热点上).如果配置文件显示很少触发空检查代码路径,则会对其进行优化,然后由信号处理程序覆盖不太可能的情况.

如果不安装自定义信号处理程序,则无法执行此类优化.