经过六个月的开发,Oracle 发布了 Java SE 23 平台(Java Platform, Standard Edition 23),该平台使用开源 OpenJDK 项目作为参考实现。除了删除一些过时的功能之外,Java SE 23 保持了与 Java 平台以前版本的向后兼容性 - 大多数以前编写的 Java 项目在新版本下运行时无需更改即可工作。 Java SE 22(JDK、JRE 和 Server JRE)的即用型安装版本适用于 Linux(x86_64、AArch64)、Windows(x86_64)和 macOS(x86_64、AArch64)。 Java 23 参考实现由 OpenJDK 项目开发,在 GPLv2 许可证下完全开源,GNU ClassPath 例外允许与商业产品动态链接。
Java SE 23 被归类为常规支持版本,并将继续接收更新,直到下一个版本。长期支持 (LTS) 分支应该是 Java SE 21 或 Java SE 17,它们将分别在 2031 年和 2029 年之前收到更新(通常在 2028 年和 2026 年之前可用)。对 Java SE 8 LTS 分支的扩展支持将持续到 2030 年,对 Java SE 11 的扩展支持将持续到 2032 年。
Java SE 提出的 23 项创新包括:
- 默认情况下启用ZGC(Generation Z Garbage Collector)垃圾收集器的生成操作模式,使用单独处理“旧”和“年轻”对象,这提高了清理最近创建的短生命周期对象的效率。使用分代 ZGC 可以降低资源分配期间停顿的风险,减少垃圾收集期间的 CPU 负载和内存消耗。使用 Apache Cassandra 4 测试分代 ZGC 表明,在固定堆大小的情况下,吞吐量增加了 4 倍,而在吞吐量恒定的情况下,堆大小减少了四分之一。
- JavaDoc 添加了对使用 Markdown 在注释中记录代码的支持,可以使用它来代替 HTML 和 JavaDoc @ 标签的混合。

- 模式匹配机制得到了增强,初步支持在各种模板、“instanceof”语句和“switch”块中使用基元类型(int、byte、char 和其他非对象基本类型)。 switch (x.getStatus()) { case 0 -> “好的”;情况 1 -> “警告”;情况 2 -> “错误”; case int i -> “未知状态:” + i; } if (i byte b 实例) { … b … }
- 添加了对使用单个“导入模块 M”语句一次性导入指定模块导出的所有包的初步支持。这一更改显着简化了模块化库的重用,允许您包含库和类,而无需确定它们在包层次结构中的位置。例如,指定“import module java.base”将导入 java.base 模块中包含的所有 54 个包,而以前需要单独提及这些包(“import java.io.*”、“import java.util.*”) “ ETC。)。
提出了 Class-File API 的第二个初步实现,用于解析、生成和转换 Java 类文件。 ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue(). startsWith("debug"))) { classBuilder.with(ce);
- Vector API 的第八个预览版提供了向量计算的函数,这些函数在 x86_64 和 AArch64 处理器上使用向量指令执行,并允许同时将运算应用于多个值 (SIMD)。与 HotSpot JIT 编译器中提供的标量操作自动向量化功能不同,新 API 可以显式控制并行数据处理的向量化。
- 向 java.io.Console 类添加了 format、printf、readPassword 和 readLine 方法,以根据所选区域设置格式化、显示和读取文本。 System.console().printf(Locale.FRANCE, "%1$tY-%1$tB-%1$te %1$tA", new Date()) 2024 年 16 月 XNUMX 日
- 添加了扩展 Stream API 的第二个预览实现,支持定义您自己的中间操作,这在现有内置中间操作不足以实现所需数据转换的情况下可能很有用。本机处理程序使用新的中间操作 Stream::gather(Gatherer) 连接,该操作通过向流元素应用用户指定的处理程序来处理流元素。 jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==> [[1, 2, 3], [4],[5]]
- 添加了隐式声明的类和“main”方法的未命名实例的第三个初步实现,它可以省去公共/静态声明、传递参数数组以及与类声明关联的其他实体。 // 是 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // 现在你可以 void main() { System.out.println("Hello, World!"); }
- 添加了功能的第二个预览,该功能允许构造函数在调用 super(...) 之前指定表达式,如果这些表达式不引用构造函数创建的实例,则用于从继承类的构造函数显式调用父类的构造函数。类外部 { void hello() { System.out.println("Hello"); } 类内部 { 内部() { 你好();极好的(); } } }
- 添加了 Scoped Values 的第三个预览实现,允许跨线程共享不可变数据以及在子线程之间高效交换数据(值是继承的)。正在开发 Scoped Values 来取代线程局部变量机制,并且在使用大量虚拟线程(数千或数百万线程)时效率更高。作用域值和线程局部变量之间的主要区别在于,前者只写入一次,以后不能更改,并且仅在线程执行期间保持可用。
- 结构化并发 API 的第三个预览版已提出用于测试,通过将不同线程中运行的多个任务作为单个块处理来简化多线程应用程序的开发。
- sun.misc.Unsafe 类提供的外部内存访问方法(JVM 外部)已被弃用并计划删除。要访问堆外内存并与外部代码交互,建议使用 VarHandle API 和 FFM(外部函数和内存)API。
此外,我们还可以注意到发布了用于使用 JavaFX 23 图形界面创建应用程序的平台更新,并且在主 Oracle JDK 23 中包含了 GraalVM JIT 编译器。
还推出了新版本的通用虚拟机 GraalVM,它支持在 JavaScript (Node.js)、Python、Ruby、R、任何 JVM 语言(Java、Scala、Clojure、Kotlin)和语言中运行应用程序可以为其生成 LLVM 位代码(C、C++、Rust)。除了支持 JDK 23 之外,新版本还优化了内存消耗和可执行代码的大小,并提供了对使用 JIT 编译将 Python 和 WebAssembly 嵌入 Java 代码的工具的全面支持。
来源: opennet.ru

