Graal JIT 编译器配置

配置 Graal JIT 编译器的选项分为三类:常规选项、性能调优选项和诊断选项。

Graal JIT 编译器主要通过系统属性进行配置,这些属性的名称以 jdk.graal 前缀开头,通过命令行上的 -Djdk.graal... 设置。可以使用 -XX:+JVMCIPrintProperties 选项打印可用属性的列表。

常规选项 #

这些是用于设置/获取配置详细信息的常规选项。

  • -XX:-UseJVMCICompiler: 禁用使用 Graal 编译器作为顶级 JIT 编译器。当您想要将 Graal JIT 编译器的性能与原生 JIT 编译器进行比较时,此选项很有用。
  • -Djdk.graal.CompilerConfiguration=<name>: 选择要使用的 Graal JIT 编译器配置。如果省略,则会选择具有最高自动选择优先级的编译器配置。要查看可用的配置,请为此选项提供值 help

    编译器配置的名称及其语义如下:

    • enterprise: 生成高度优化的代码,可能以编译时间为代价(仅在 Oracle GraalVM 中可用)。
    • community: 生成合理优化的代码,编译速度更快。
    • economy: 尽可能快地编译,生成的代码的吞吐量较低。
  • -Djdk.graal.ShowConfiguration=<level>: 打印有关所选 Graal JIT 编译器配置的信息。此选项仅在编译器初始化时生成输出。默认情况下,Graal JIT 编译器在第一次顶级编译时初始化。因此,使用此选项的方法如下:java -XX:+EagerJVMCI -Djdk.graal.ShowConfiguration=info -version

    接受的参数为

    • none: 不显示任何信息。
    • info: 打印一行输出,描述正在使用的编译器配置及其加载位置。
    • verbose: 打印详细的编译器配置信息。
  • -Djdk.graal.SpectrePHTBarriers=<strategy>: 选择一种策略来缓解推测性边界检查绕过(也称为 Spectre-PHT 或 Spectre V1)。

    接受的参数为

    • None: 在 JIT 编译的代码中不使用任何缓解措施。(默认值。)
    • AllTargets: 使用推测性执行屏障指令来停止所有分支目标上的推测性执行。此选项等同于将 SpeculativeExecutionBarriers 设置为 true。(这会对性能造成很大影响。)
    • GuardTargets: 使用屏障指令对与 Java 内存安全相关的分支目标进行检测。仅保护那些保留 Java 内存安全的 Branches。(此选项对性能的影响小于 AllTargets。)
    • NonDeoptGuardTargets: 与 GuardTargets 相同,但会忽略被 deoptimize 的 branches,因为它们不会重复执行,因此不太可能在攻击中被成功利用。

    请注意,除了 None 之外的所有模式还使用屏障指令对包含 UNSAFE 内存访问的分支目标块进行检测。

性能调优选项 #

  • -Djdk.graal.Vectorization={ true | false }: 禁用自动向量化优化(仅在 Oracle GraalVM 中可用)。(默认值:true。)
  • -Djdk.graal.OptDuplication={ true | false }: 禁用 路径重复优化(仅在 Oracle GraalVM 中可用)。(默认值:true。)
  • -Djdk.graal.TuneInlinerExploration=<value>: 调整以获得更好的峰值性能或更快的预热。它会自动调整控制内联过程中所花费努力的值。选项的值是一个浮点数,在 -11 之间(包含)。任何低于 0 的值都会减少内联工作量,任何高于 0 的值都会增加内联工作量。通常,更高的内联工作量可以提高峰值性能,而较低的内联工作量可以改善预热(尽管峰值较低)。请注意,此选项只是一个启发式方法,最佳值可能因应用程序而异(仅在 Oracle GraalVM 中可用)。

诊断选项 #

  • -Djdk.graal.CompilationFailureAction=<action>: 指定编译失败时要采取的操作,即抛出异常。

    接受的操作

    • Silent: 不向控制台打印任何内容。(默认值。)
    • Print: 向控制台打印堆栈跟踪。
    • Diagnose: 启用额外的诊断功能以重新尝试编译。在 JVM 退出时,收集到的诊断信息将保存到一个 ZIP 文件中,可以将其与错误报告一起提交。一条消息将打印到控制台中,说明诊断文件保存的位置。
      Graal diagnostic output saved in /Users/graal/graal_dumps/1549459528316/graal_diagnostics_22774.zip
      
    • ExitVM: 与 Diagnose 相同,但 JVM 在重新尝试后退出。

    对于除 ExitVM 之外的所有值,JVM 都会继续执行。

  • -Djdk.graal.CompilationBailoutAsFailure={ true | false }: 编译器可能无法完成方法的编译,因为方法中存在某些属性或代码形状(例如,jsrret 字节码的异类用法)。在这种情况下,编译会放弃。如果您想要了解此类放弃情况,此选项会使 Graal JIT 编译器将放弃视为失败,从而受 -Djdk.graal.CompilationFailureAction 选项指定的操作影响。(默认值:false。)

使用语言启动器设置编译器选项 #

以上 Graal JIT 编译器属性可与其他一些 GraalVM 启动器一起使用,例如 nodejs。用于指定属性的前缀略有不同。例如

java -XX:+EagerJVMCI -Djdk.graal.ShowConfiguration=info -version

变为

js --vm.Djdk.graal.ShowConfiguration=info -version

请注意,-D 前缀被替换为 --vm.D

与我们联系