2026年8月,JDK 28的JEP列表逐渐清晰。没有虚拟线程那种刷屏级发布,但几个改动——值对象预览、Shenandoah分代模式默认开启、严格字段初始化——每一个都直指JVM深处。升级前不看清楚,生产环境可能莫名其妙就炸了。
一、先厘清一个时间线
用户提到的“8月6日Initial RC,9月15日GA”——这是JDK 27的时间线,不是JDK 28。
JDK 28是2027年3月发布的非LTS特性版本,目前仍在积极开发中,Early-Access builds已开放下载。
那么问题来了:JDK 27还没正式GA,为什么现在就要关注JDK 28?
因为JDK 28的JEP列表已经基本清晰,几个重量级特性正在向目标冲刺。现在不看清楚,等明年3月升级时再踩坑,就晚了。
二、JEP 401:值对象——Java十年最大的语言变动
这是JDK 28最重磅的特性,没有之一。
值对象(Value Objects)是不可变、无对象标识(identity)的对象。它们的相等性由字段值决定,而非内存地址:
java
// 传统对象:两个不同的实例不相等,即使字段值一样 Point p1 = new Point(1, 2); Point p2 = new Point(1, 2); p1 == p2; // false —— 因为 identity 不同 // 值对象:字段值一样就相等 value class Point(int x, int y) { } Point p1 = new Point(1, 2); Point p2 = new Point(1, 2); p1 == p2; // true —— 按值比较值对象的意义远不止语法糖:
JVM可以用更紧凑的内存布局表示值对象,减少内存占用和GC压力
不可变性天然适合并发场景,不用再写防御性拷贝
为Valhalla项目的终极目标——值类型(Value Types)——铺平道路
代价:值对象是预览语言特性,生产环境需要加--enable-preview。而且这是Java语言层面近十年最大的变动之一——OpenJDK为此贡献了近20万行代码。第三方库、框架、字节码工具都可能被影响。
⚠️升级前必做:检查代码中是否依赖对象标识(如
==比较、synchronized锁、System.identityHashCode())。值对象在这些场景下的行为与传统对象完全不同。
三、JEP 535:Shenandoah GC——分代模式默认开启
继JDK 27将G1设为全局默认GC后【JEP 523】,JDK 28对Shenandoah GC下了同样的决心:默认启用分代(Generational)模式,非分代模式被标记为弃用,未来版本将移除。
分代模式的好处:
年轻代和老年代分开管理,多数对象死在年轻代,GC开销大幅降低
吞吐量和延迟的平衡更优,特别是在大堆内存场景
代价:
非分代模式下的调优参数将失效(如
-XX:ShenandoahGCMode相关参数)如果你之前手动禁用了分代模式(
-XX:-UseShenandoahGCGenerational),升级后这个参数不再起作用
⚠️升级前必做:检查JVM启动参数中是否有Shenandoah相关的非分代模式调优。如果有,重新评估并移除,否则可能被静默忽略。
四、JEP 539:严格字段初始化——JVM层的安全保障
这是一个JVM预览特性,针对的是语言设计者和编译器开发者,普通应用开发者短期内不会直接接触。
核心逻辑:字段必须被显式初始化之后才能读取,永远不会观察到0、null、false等默认值。
java
// 传统JVM行为:未初始化的final字段可能被观察到默认值 // 严格初始化后:编译器会阻止这种情况
意义:
为基于JVM的其他编程语言(如Kotlin、Scala)提供更强的初始化完整性保证
减少因字段未初始化导致的难以排查的空指针异常
代价:
字节码生成工具、AOP框架、ORM框架可能需要适配新的初始化语义
预览特性,默认不启用
⚠️升级前必做:如果你使用CGLIB、ByteBuddy、ASM等字节码操作库,在JDK 28上跑一遍回归测试。
五、JEP 540:简单JSON API——终于不用引第三方库了
Java开发者等了二十多年的东西——标准库自带的JSON API,以孵化器(Incubator)模块形式引入。
这意味着:
未来可能不再需要引入Jackson、Gson、JSON-B等第三方库来处理基础JSON
API设计会参考现有主流实现,降低学习成本
孵化器模块意味着API可能会变化,生产环境慎用
⚠️升级前必做:可以在测试环境试用,但生产环境暂时不建议依赖孵化器API——未来版本可能调整。
六、JEP 541:弃用macOS/x64移植版
Apple已经停止支持x64架构,全面转向Apple Silicon。JDK 28正式弃用macOS/x64移植版,未来版本将移除。
影响:
如果你还在Intel Mac上开发,JDK 28仍可用,但后续版本可能不再支持
CI/CD流水线中如果使用macOS x64 runner,需要提前规划迁移
⚠️升级前必做:检查开发和CI环境中的macOS x64依赖,提前规划迁移到Apple Silicon或Linux。
七、其他值得关注的变动
JEP 542:PEM编码支持——标准API处理PEM格式的密钥和证书,未来可能不再依赖BouncyCastle
ParallelRefProcBalancingEnabled标志移除——该标志在JDK 26被弃用、JDK 27被标记为过时,JDK 28正式移除
ListFormat单引号转义修复——
java.text.ListFormat不再受MessageFormat单引号转义语义影响Class文件版本升级到v71.0——代表Java SE 28
jlink新增证书裁剪插件
八、升级清单:该干嘛
现在(2026年8月):
关注JEP 401(值对象)——代码中是否依赖对象标识?是否有大量使用
==比较对象的逻辑?检查Shenandoah GC调优参数——是否有
-XX:-UseShenandoahGCGenerational?移除或重新评估评估字节码工具兼容性——CGLIB、ByteBuddy、ASM在JDK 28 EA上的表现
规划macOS x64迁移——如果还在用Intel Mac开发或CI
JDK 28 RC发布后(预计2027年初):
在测试环境部署JDK 28,跑一遍核心应用的回归测试
重点测试使用
==比较对象的代码(值对象语义变化)检查GC日志和监控,确认Shenandoah分代模式的行为是否符合预期
扫描代码中是否有依赖未初始化字段默认值的黑魔法
生产环境:
JDK 28是非LTS版本,Oracle只提供6个月支持。核心生产系统建议等待下一个LTS版本(预计JDK 29或后续版本)。JDK 28适合测试环境踩坑和为LTS版本做准备,不适合直接上生产。
九、总结
JDK 28没有虚拟线程那种“刷屏级”发布,但值对象预览是Java语言近十年最大的变动之一,Shenandoah分代模式默认开启动的是GC的底层逻辑,严格字段初始化动的是JVM的初始化语义。
三个改动,每一个都可能让依赖特定行为的老代码在生产环境莫名其妙就炸了。
升级前不看清楚,等明年3月GA之后再踩坑,代价就大了。
现在就去下载JDK 28 Early-Access,在测试环境跑起来。