- 适用于 JDK 23 的 GraalVM(最新)
- 适用于 JDK 24 的 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 内存安全的 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>
: 调整以获得更好的峰值性能或更快的预热。它会自动调整控制内联过程中所花费努力的值。选项的值是一个浮点数,在-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
字节码的异类用法)。在这种情况下,编译会放弃。如果您想要了解此类放弃情况,此选项会使 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
。