java - 为什么-Xrs会降低性能

标签 java jvm

来自 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.

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 会降低性能?

最佳答案

因为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 - Android 应用程序的自定义字体

java - 是否可以使用 JFR 和 JMC(JDK Mission Control)可视化每个线程的 CPU 使用情况?

java - 为什么 Java 安全点从未达到?线程挂起,安全点超时

java - 从在 docker 容器中运行的 JVM 应用程序将日志发送到 graylog 的最佳做法是什么?

java - GuardedString 和 JVM 的内存持久性

linux - 执行 grails -version 时在 VM 初始化期间发生错误

java - 自定义 OpenNLP 名称查找器可识别训练集中的数据,但无法识别测试集中的数据

java - 如何使用 SublimeLinter-javac 将 Gradle 托管依赖项添加到我的类路径?

java - 有没有 ListView 的下拉刷新功能的好例子?

spring-boot - Spring Actuator的 "jvm.memory.max"指标与Runtime.getRuntime()。maxMemory()不匹配