- 适用于 JDK 24 的 GraalVM(最新)
- 适用于 JDK 25 的 GraalVM(早期访问)
- 适用于 JDK 21 的 GraalVM
- 适用于 JDK 17 的 GraalVM
- 存档
- 开发构建
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>: 用于调优以获得更好的峰值性能或更快的预热。它会自动调整内联过程中所花费工作的值。该选项的值是一个介于-1和1(含)之间的浮点数。任何小于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.zipExitVM: 与Diagnose相同,但 JVM 进程在重试后退出。
对于除
ExitVM之外的所有值,JVM 会继续运行。 -
-Djdk.graal.CompilationBailoutAsFailure={ true | false }: 编译器可能因方法中的某些属性或代码形状(例如,jsr和ret字节码的特殊用法)而无法完成方法的编译。在这种情况下,编译会中止(bail out)。如果您想了解此类中止情况,此选项会使 Graal JIT 编译器将中止视为失败,从而受-Djdk.graal.CompilationFailureAction选项指定的操作的约束。(默认值:false。)
使用语言启动器设置编译器选项 #
上述 Graal JIT 编译器属性可与某些其他 GraalVM 启动器(如 node 和 js)一起使用。指定属性的前缀略有不同。例如
java -XX:+EagerJVMCI -Djdk.graal.ShowConfiguration=info -version
变为
js --vm.Djdk.graal.ShowConfiguration=info -version
请注意,
-D前缀被--vm.D替换。