将应用的垃圾回收器切换为 ZGC 后,发现分代模式已自动启用——那一刻真切感受到,Java 正在一步步贴合生产环境的实际诉求。
2024年9月17日,JDK 23正式发布了。它是JDK 22之后的又一个短期版本,生命周期还是半年。说实话,很多开发者都觉得,这种短期版本没什么大用处,用完半年就过时了,但我不这么看:正是这些小版本一点点打磨、试错,后续的LTS版本才能足够稳定、足够好用,也能看出来,Java社区是真的在替我们开发者考虑,注重实际的使用体验。
作为非LTS版本,这次更新的优化都藏在细节里:ZGC分代模式默认开启,开始清理Unsafe这类高危API,switch也能直接匹配int类型了。这些改动要么优化底层性能,要么方便日常编码,精准解决了我们实际开发中的痛点。
所有特性均严格遵循 JSR 398(《Java SE 23 发布规范》) 制定。作为一款典型的短期版本,它的核心发力方向集中在三点:
Unsafe 等高危 API 的清理工作。这应该是 JDK 23 里最实用的一个更新了,没有之一。熟悉 Java 的朋友都知道,ZGC(Z垃圾回收器)刚出来的时候,最吸引人的就是“亚毫秒级停顿”,所以很多对延迟要求高的应用,比如金融交易、高并发接口,都优先用它。不过它之前有个小遗憾,就是分代模式得手动开启,而这个模式是 JDK 21 就加了的,经过两个版本的打磨,这次 JDK 23 终于把它设成默认了,不用再额外配置,太省心了。
sun.misc.Unsafe 的内存访问方法(JEP 471)这是 Java 生态清理历史包袱的一个里程碑式动作。sun.misc.Unsafe 对 Java 开发者而言,一直是一把“双刃剑”——它提供了直接操作内存的底层能力,却也带来了极大的安全隐患和稳定性风险,稍有不慎就可能导致 JVM 崩溃。
Unsafe 中用于堆外内存分配、访问的一系列方法(如 allocateMemory、getLong、putInt 等)标记为“弃用待移除”(Deprecate for Removal)。这是 JDK 23 中最让人惊喜的语言特性。过去几年,Java 的模式匹配功能一直在稳步演进,但始终存在一个尴尬的短板:无法直接对 int、double 等基本类型进行模式匹配,必须先将其装箱为 Integer、Double 等包装类型。
如今,开发者可以直接对基本类型进行字面量匹配,代码更简洁、更高效:
// JDK 23 (预览)
switch (obj) {
case int i -> System.out.println("Got an int: " + i);
case double d -> System.out.println("Got a double: " + d);
case String s -> System.out.println("Got a string: " + s);
}这一改进彻底打破了基本类型与引用类型在模式语法上的割裂感,让代码编写更符合开发者的直觉,同时避免了装箱拆箱带来的性能损耗。
注意:该特性在 JDK 23 中处于预览阶段,编译和运行时需添加 --enable-preview 参数。
Unsafe 高危方法,是 Java 生态向更安全、更健壮方向迈进的关键一步,为后续生态规范化发展奠定了基础。ThreadLocal,提供了更安全、高效的不可变上下文数据传递方式,与结构化并发特性天然契合,适配复杂并发场景。void main() { ... },无需显式声明类,极大减少了脚本编写和教学示例中的冗余代码。JDK 23 依据 JSR 398 规范,完成了一次聚焦痛点、务实高效的版本迭代。它没有追求噱头式的宏大概念,而是将重心放在解决开发者日常编码、生产运维中的实际问题上。分代 ZGC 设为默认,是给开发者的一份“性能大礼”;弃用 Unsafe 高危方法,是对 Java 生态长远健康的投资。与此同时,基本类型模式匹配、结构化并发等前沿特性的持续打磨,也让 Java 的未来发展方向更加清晰。JDK 23 再次证明,Java 的演进从来都不是一蹴而就的革命,而是一场兼顾当下实用、布局未来发展的长期深耕,每一步都贴合开发者的实际需求。
[1] JSR 398: Java SE 23 规范: https://www.jcp.org/en/jsr/detail?id=398
[2] OpenJDK JDK 23 官方页面: https://openjdk.org/projects/jdk/23/
[3] JEP 474: Generational ZGC: https://openjdk.org/jeps/474
[4] JEP 471: Deprecate Unsafe Memory Access Methods: https://openjdk.org/jeps/471
[5] JEP 455: Primitive Types in Patterns (Preview): https://openjdk.org/jeps/455