首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么-Xrs会降低性能

为什么-Xrs会降低性能
EN

Stack Overflow用户
提问于 2016-01-22 16:45:14
回答 2查看 9.7K关注 0票数 15

来自IBM:

-Xrs 禁用JVM中的信号处理。 -Xrs 设置-Xrs可以防止™运行时环境处理任何内部或外部生成的信号,如SIGSEGV和SIGABRT。引发的任何信号都由默认操作系统处理程序处理。根据应用程序的不同,JVM中的禁用信号处理会降低大约2-4%的性能。 -Xrs:sync 在UNIX系统上,此选项禁用用于SIGSEGV、SIGFPE、SIGBUS、SIGILL、SIGTRAP、andSIGABRT信号的JVM中的信号处理。但是,JVM仍然处理SIGQUIT和SIGTERM信号等。与-Xrs一样,使用-Xrs:sync将性能降低约2-4%,这取决于应用程序.。 注意:设置此选项可以防止JVM为SIGSEGV和SIGABRT等信号生成转储,因为JVM不再拦截这些信号。

7.0.0/com.ibm.java.aix.70.doc/diag/appendixes/cmdline/Xrs.html

据我所知,-Xrs实际上是用来防止在拦截某些OS信号时产生转储。

由于JVM不再拦截和处理这些信号,因此可以推断这将提高性能,而不是IBM声称的降低性能。

为什么-Xrs会降低性能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-22 17:08:22

由于安全点和VM操作,以及如果允许JIT管理信号,JIT可以进行的其他优化。

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

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

当JVM确实需要执行VM操作时,它会使该内存页无效。下一次当每个线程碰到一个safepoint时,它现在会导致一个分段错误,它允许JVM重新控制该线程的执行;它一直保持到VM操作完成为止,重置哨兵页面,并重新启动所有线程。

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

此外,JVM在分析(本质上类似于CPU的分支预测器)时做了一些非常神奇的工作。它使用的优化之一是,如果它检测到某个null检查几乎从不为null,它将删除该检查,并依赖于分段错误(昂贵,但在这种情况下罕见)来捕获空。这种优化还需要自定义处理SIGSEGV。

票数 19
EN

Stack Overflow用户

发布于 2016-01-23 07:23:02

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

如果不安装自定义信号处理程序,就无法执行这样的优化。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34951812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档