使用GraalVM 21运行JavaFX应用启用分代ZGC出现JVMCI不支持警告原因
问题背景
环境信息
- OS:MacOS 12.7.3(intel)
- JDK:
openjdk version "21.0.2" 2024-01-16 OpenJDK Runtime Environment GraalVM CE 21.0.2+13.1 (build 21.0.2+13->jvmci-23.1-b30) OpenJDK 64-Bit Server VM GraalVM CE 21.0.2+13.1 (build 21.0.2+13->jvmci-23.1-b30, mixed mode, sharing) - JavaFX版本:21.0.2
- javafx-maven-plugin版本:0.0.8
- javafx.staticSdk版本:21-ea+11.1
插件配置
使用javafx-maven-plugin运行JavaFX应用的配置(包含自定义JVM参数):
<plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>${javafx-maven-plugin.version}</version> <executions> <execution> <!-- Default configuration for running with: mvn clean javafx:run --> <id>default-cli</id> <configuration> <mainClass>${mainClass}</mainClass> <launcher>app</launcher> <jlinkZipName>app</jlinkZipName> <jlinkImageName>app</jlinkImageName> <noManPages>true</noManPages> <stripDebug>true</stripDebug> <noHeaderFiles>true</noHeaderFiles> <options> <option>-XX:+UseZGC</option> <option>-XX:+ZGenerational</option> </options> </configuration> </execution> </executions> </plugin>
运行警告
启用分代ZGC后,执行mvn clean javafx:run时出现如下警告:
[INFO] <<< javafx-maven-plugin:0.0.8:run (default-cli) < process-classes @ jfxdemo <<< [INFO] [INFO] [INFO] --- javafx-maven-plugin:0.0.8:run (default-cli) @ jfxdemo --- [0.004s][warning][gc,jvmci] Setting EnableJVMCI to false as selected GC does not support JVMCI: z gc
疑问
该警告是什么含义?是否意味着应用无法被Graal优化?
解答
警告含义
这个警告的核心意思是:你启用的ZGC(包括分代ZGC)目前不支持JVMCI(Java虚拟机编译器接口),JVM自动将EnableJVMCI参数设置为false。而JVMCI是Graal编译器和HotSpot JVM之间的交互桥梁,没有它,Graal的即时编译(JIT)功能就无法启动。
是否失去Graal优化?
是的——当EnableJVMCI被禁用后,Graal JIT编译器无法工作,应用会自动切换到HotSpot的默认C2编译器,无法享受Graal带来的编译优化。
不过有个例外:如果你的目标是用GraalVM构建原生镜像(Native Image),这个警告完全不影响。因为原生镜像的编译是在构建阶段完成的,和JVM运行时的JVMCI、GC选择无关,原生镜像依然能获得Graal的优化。但如果是在标准JVM模式下运行应用,启用ZGC就会失去Graal JIT的优化能力。
可选处理方案
- 更换GC:放弃ZGC,改用支持JVMCI的垃圾回收器(比如G1GC、Shenandoah),这样就能正常启用Graal JIT优化。
- 保留ZGC:接受使用HotSpot默认编译器,继续享受ZGC的低延迟特性。
- 原生镜像场景:直接忽略该警告,不影响原生镜像的构建和运行优化。
内容的提问来源于stack exchange,提问作者BreakingGood
相关产品推荐
相关产品推荐

