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 内存安全的分支。(此选项的性能影响低于 AllTargets。)
    • NonDeoptGuardTargets: 与 GuardTargets 相同,但去优化(deoptimized)的分支不受保护,因为它们不能重复执行,因此在攻击中被成功利用的可能性较小。

    请注意,除 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 字节码的特殊用法)而无法完成方法的编译。在这种情况下,编译会中止(bail out)。如果您想了解此类中止情况,此选项会使 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 替换。

联系我们