jdk 21起支持分代zgc,需同时启用-xx:+usezgc和-xx:+zgenerational(jdk 24后该参数已移除),且java -version必须显示21或更高版本。

怎么确认你的JDK版本支持分代ZGC
分代ZGC不是加个参数就生效的“开关”,它从JDK 21开始作为实验性特性引入(JEP 439),到JDK 24才成为默认行为。如果你用的是JDK 20或更早,-XX:+ZGenerational会直接被忽略,甚至报错“Unrecognized VM option”。
- 运行
java -version,输出必须包含21、22、23或更高 ——21.0.1是最低可用LTS版本 - 非LTS版本(如JDK 22/23)也可用,但生产环境建议锁定JDK 21或等待JDK 25(2025年9月发布)
- 别信“JDK 17 + ZGC补丁”这种方案:分代逻辑深度耦合JVM内存管理层,无法后向移植
启动时必须写的两个核心JVM参数
启用分代ZGC只需且仅需两个布尔开关,其他所谓“调优参数”在绝大多数场景下不仅多余,反而干扰自适应策略。
-
-XX:+UseZGC:启用ZGC本身,没有它,-XX:+ZGenerational毫无意义 -
-XX:+ZGenerational:告诉JVM走分代路径 —— 注意是+号,不是=true;写成-XX:ZGenerational=true会失败 - 堆大小必须显式设置:
-Xms12g -Xmx12g(推荐初值=最大值,避免动态扩容抖动) - 别碰
-Xmn、-XX:MaxTenuringThreshold这类G1/Parallel GC的老参数 —— 分代ZGC完全不认它们,设了也白设
常见启动失败现象和真实原因
你看到应用起不来,大概率不是配置写错了,而是依赖或环境没对齐。
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。 本书内容全面深入,适合各层次PHP和MySQL开发人员阅读,既是优秀的学习教程,也可用作参考手册。
- 启动时报
NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'qualid'→ Lombok版本太低,必须升级到1.18.30+ - Spring Boot应用启动卡住或抛
UnsupportedClassVersionError→ Spring Boot低于2.7.18或未迁移到3.x,JDK 21字节码不兼容 - IDE里能跑,命令行启动失败 → IntelliJ IDEA等工具可能默认加了
--add-opens或预设了--enable-preview,而你手动执行时漏掉了(尤其搭配虚拟线程时) - 日志里没出现
Using generational ZGC→ 检查JVM参数是否被脚本覆盖,比如java -jar前有JAVA_OPTS环境变量,里面可能含-XX:+UseG1GC冲突项
验证是否真启用了分代模式
光看启动日志还不够,得抓运行时证据。分代ZGC会在JMX中暴露独立的内存池和GC事件,这是最硬的判断依据。
- 启动时加日志:
-Xlog:gc*,age*=info,观察输出中是否出现Young GC和Old GC两类事件(传统ZGC只有ZGC GC) - 运行中执行:
jcmd <pid> VM.info | grep gc</pid>,输出应含ZGC (Generational)字样 - 用JConsole或VisualVM连上去,查看
Memory Pool节点下是否有名为ZYoung和ZOld的池子 —— 这是分代ZGC独有的命名 - 别依赖
jstat -gc:它的列名仍是旧式ZGC字段(如ZGCTime),无法区分代际
最容易被忽略的一点:JDK 24起,-XX:+ZGenerational已被移除,加了反而触发警告;但如果你还在用JDK 21–23,漏掉它就等于退回传统ZGC —— 停顿时间多出一倍,吞吐下降,却以为是“ZGC本来就这样”。










