当使用-server -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:+UseJVMCICompiler时,使用哪个编译器?

7
我的JVM有-server选项,我相信它启用了JVM使用C2编译器,该编译器专为运行时间较长的服务器应用程序而设计。然而,GRAAL JIT(通过-XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:+UseJVMCICompiler启用)旨在替换C2,并且即使我给出以下两个选项,我的JVM也会启动。

-server -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:+UseJVMCICompiler

它最终使用哪个编译器?Graal JIT还是C2?


请注意,-server 选择的是 VM 而不是编译器。现在,服务器 VM 默认使用分层 C1 + C2 编译(但实际上您可以让它仅使用 C1 或 C2)。UseJVMCICompiler 是服务器 VM 中可用的选项,它使其使用 JVMCI API 实现的编译器来替换 C2。 - Gilles D.
1个回答

8

-server 参数会被忽略,例如可以参考此答案。您可以通过运行一些额外命令来实现:

 java -XX:+UnlockExperimentalVMOptions 
      -XX:+EnableJVMCI 
      -XX:+UseJVMCICompiler  
      -Dgraal.ShowConfiguration=info  // this
      -XX:+EagerJVMCI  // and this matters

结果将包含:
Using Graal compiler configuration 'community' ..... 

请问您能否详细说明一下-XX:+EagerJVMCI,这个参数是否必须在使用Graal JIT时使用? - Sagar
3
起初,代码以解释模式开始运行。记得有5个层次会在代码变“热”时依次触发。然而,Graal只有在第一层被激活时才进行延迟加载。因此,除非您调用了使用Graal编译的某些方法(隐式地进行初始化),否则您将看不到任何效果。该标志使其立即初始化。 - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接