- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
来自 IBM:
-Xrs
Disables signal handling in the JVM.
-Xrs
Setting -Xrs prevents the Java™ run time environment from handling any internally or externally generated signals such as SIGSEGV and SIGABRT. Any signals that are raised are handled by the default operating system handlers. Disabling signal handling in the JVM reduces performance by approximately 2-4%, depending on the application.
-Xrs:sync
On UNIX systems, this option disables signal handling in the JVM for SIGSEGV, SIGFPE, SIGBUS, SIGILL, SIGTRAP, andSIGABRT signals. However, the JVM still handles the SIGQUIT and SIGTERM signals, among others. As with -Xrs, the use of -Xrs:sync reduces performance by approximately 2-4%, depending on the application.
Note: Setting this option prevents dumps being generated by the JVM for signals such as SIGSEGV and SIGABRT, because the JVM is no longer intercepting these signals.
据我了解,-Xrs
确实用于防止在拦截某些操作系统信号时生成转储。
由于 JVM 不再拦截和处理这些信号,因此有理由认为这会提高性能,而不是像 IBM 声称的那样降低性能。
为什么 -Xrs
会降低性能?
最佳答案
因为safepoints和 VM 操作,以及 JIT 可以执行的其他优化(如果您允许它管理信号)。
JVM 偶尔不得不执行一些需要它全局暂停执行(“stop the world”)的操作,例如某些大规模的垃圾收集、热重载或内部重新编译类等。为了做到这一点,它必须确保所有正在运行的线程同时遇到障碍并暂停,执行操作,然后释放线程。
HotSpot(可能还有其他 JVM)用来实现安全点的一种技术是对段错误的巧妙滥用:它设置一个实际上不用于任何数据的内存页面,然后每个线程定期尝试从该页面读取.当不需要 VM 操作时,读取成功且开销非常低,并且线程保持运行。
当 JVM 确实需要执行 VM 操作时,它会使该内存页无效。 The next time each thread hits a safepoint, it now causes a segfault ,这让 JVM 重新获得对该线程执行的控制;它一直保持到 VM 操作完成,重置哨兵页面,并重新启动所有线程。
当您禁用 SIGSEGV 处理时,JVM 必须使用其他技术来同步安全点,这些技术的效率低于委托(delegate)给处理器的内置内存保护。
此外,JVM 在分析方面发挥了一些重要作用(本质上类似于 CPU 的分支预测器)。它使用的优化之一是,如果它检测到某个 null 检查几乎从不为 null,它会忽略该检查并依赖于段错误(昂贵,但在这种情况下很少见)来捕获 null。此优化还需要自定义处理 SIGSEGV。
关于java - 为什么-Xrs会降低性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34951812/
为什么有人会使用 Java 命令行选项 -Xrs ? 根据 Java 文档,该选项避免 JVM 处理信号。 在什么情况下您会想要这样做? 最佳答案 来自doc If the Java VM is ru
我们的 Java 应用程序在 Windows 上反复出现的一个问题是客户将其作为 Windows 服务运行而未指定 Java -Xrs 标志。这样,当管理员注销 Windows 机器时,Java 进程
我的 Jenkins 不想用参数启动 -Xrs -Xmx2048m -XX:MaxPermSize=512m -Dhudson.lifecycle=hudson.lifecycle.WindowsSe
我是一名优秀的程序员,十分优秀!