为什么-Xrs会降低性能

时间:2016-01-22 16:45:14

标签: 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实际上用于防止在拦截某些操作系统信号时生成转储。

由于JVM不再拦截和处理这些信号,因此可以理解这将增加性能,而不是像IBM声称的那样减少

为什么-Xrs会降低效果?

2 个答案:

答案 0 :(得分:11)

由于safepoints和VM操作,以及JIT在允许它管理信号时可以执行的其他优化。

JVM偶尔必须执行一些操作,要求它全局暂停执行("停止世界"),例如某些大规模垃圾收集,热重新加载或内部重新编译类等等。 。为了做到这一点,它必须确保所有正在运行的线程都碰到障碍并同时暂停,执行操作,然后释放线程。

HotSpot(以及可能的其他JVM)用于实现安全点的一种技术是巧妙滥用段错误:它设置一个实际上不用于任何数据的内存页,然后每个线程定期尝试从该页读取。当不需要VM操作时,读取成功且开销非常低,并且线程一直在运行。

当JVM 需要执行VM操作时,它会使该内存页无效。 The next time each thread hits a safepoint, it now causes a segfault,它让JVM重新获得对该线程执行的控制权;它一直保持到VM操作完成,重置sentinel页面,然后重新启动所有线程。

当您禁用SIGSEGV处理时,JVM必须使用其他技术来同步安全点,这些安全点的效率低于委派给处理器的内置内存保护。

此外,JVM在分析方面做了一些重要的魔术(基本上类似于CPU的分支预测器)。它使用的一个优化是,如果它检测到某个空检查几乎从不为null,它就会省略检查并依赖于段错误(代价很高,但在这种情况下很少见)来捕获空值。此优化还需要自定义处理SIGSEGV。

答案 1 :(得分:5)

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

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