- 适用于 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.zip
ExitVM
: 与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
替换。