Java SE 22 平台和 OpenJDK 22 开放参考实现的发布

经过六个月的开发,Oracle 发布了 Java SE 22(Java Platform, Standard Edition 22),它使用 OpenJDK 开源项目作为参考实现。 除了删除了一些已弃用的功能外,Java SE 22 保持与以前版本的 Java 平台的向后兼容性——大多数以前编写的 Java 项目在新版本下运行时仍然可以不加修改地运行。 Java SE 22(JDK、JRE 和 Server JRE)的可安装版本已为 Linux(x86_64、AArch64)、Windows(x86_64)和 macOS(x86_64、AArch64)准备。 由 OpenJDK 项目开发的 Java 22 参考实现在 GPLv2 许可下完全开放,具有 GNU ClassPath 例外,允许动态链接到商业产品。

Java SE 22 被归类为常规支持版本,并将继续接收更新,直到下一个版本。长期支持 (LTS) 分支应该是 Java SE 21 或 Java SE 17,它们将分别在 2031 年和 2029 年之前收到更新(通常在 2028 年和 2026 年之前可用)。对 Java SE 11 LTS 分支的公开支持已于去年 2032 月结束,但扩展支持将持续到 8 年。对 Java SE 2030 LTS 分支的扩展支持将持续到 XNUMX 年。

让我们提醒您,从Java 10发布开始,该项目切换到了新的开发流程,这意味着新版本的形成周期更短。现在,新功能是在一个不断更新的主分支中开发的,其中包括现成的更改,并且每六个月从该分支分支一次以稳定新版本。

Java 22 的新特性包括:

  • G1 垃圾收集器支持区域固定,它允许您临时固定 Java 对象在内存中的位置,以避免它们被垃圾收集器移动,并允许对这些对象的引用在 Java 和本机代码之间安全传递。固定允许您在使用本机代码执行 JNI(Java 本机接口)的关键区域时减少延迟并避免禁用垃圾收集(在执行这些部分时,JVM 不应移动与其关联的关键对象,以避免竞争条件)。固定会从垃圾收集器的视野中删除关键对象,垃圾收集器可以继续清理未固定的区域。
  • 添加了一项初步功能,允许在调用 super(...) 之前在构造函数中指定表达式,如果这些表达式不引用构造函数创建的实例,则用于从继承类构造函数显式调用父类构造函数。类外部 { void hello() { System.out.println("Hello"); } 类内部 { 内部() { 你好();极好的(); } } }
  • FFM(外部函数和内存)API 已经稳定,允许 Java 程序通过调用外部库的函数并访问 JVM 外部的内存来与外部代码和数据进行交互,而无需求助于使用 JNI(Java 本机接口)。
  • 已启用对未命名变量和模式匹配的支持 - 现在您可以指定“_”字符,而不是调用时未使用但必需的变量和模式。 // was String pageName = switch (page) { case GitHubIssuePage(var url, var content, var links, int issuesNumber) -> “ISSUE #” + issuesNumber; ... }; // 现在你可以 String pageName = switch (page) { case GitHubIssuePage(_, _, _, int issuesNumber) -> “ISSUE #” + issuesNumber; };
  • 提出了 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); } } });
  • java 实用程序提供了运行以多个代码文件或预编译类库的形式提供的 Java 程序的能力,无需单独编译这些文件,也无需配置构建系统。新功能使得运行将不同类的代码分为单独文件的程序变得更加容易。 Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } Helper.java: class Helper { static void run() { System.out.println("Hello!"); } }

    例如,要运行由两个文件“Prog.java”和“Helper.java”组成的程序,现在运行“java Prog.java”就足够了,它将编译 Prog 类,定义对 Helper 类的引用,找到并编译Helper文件.java并调用main方法。

  • 添加了字符串模板的第二个初步实现,除了字符串文字和文本块之外还实现了。字符串模板允许您将文本与计算表达式和变量组合在一起,而无需使用 + 运算符。表达式的替换是使用替换 \{..} 进行的,并且可以连接特殊的处理程序来检查替换值的正确性。例如,SQL 引擎检查被替换到 SQL 代码中的值并返回 java.sql.Statement 对象作为输出,而 JSON 处理器监视 JSON 替换的正确性并返回 JsonNode。字符串查询 =“SELECT * FROM Person p WHERE p.” + 属性 + " = '" + 值 + "'"; // was 语句查询 = SQL."""SELECT * FROM Person p WHERE p.\{property} = '\{value}'"""; // 变成
  • 添加了矢量 API 的第七个预览版,提供了在 x86_64 和 AArch64 处理器上使用矢量指令执行矢量计算的函数,并允许同时将运算应用于多个值 (SIMD)。与 HotSpot JIT 编译器中提供的标量操作自动向量化功能不同,新 API 可以显式控制并行数据处理的向量化。
  • 添加了扩展 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]]
  • 结构化并发实验性 API 的第二个版本已被提议进行测试,该版本通过将不同线程中执行的多个任务作为单个块处理来简化多线程应用程序的开发。
  • 添加了隐式声明的类和“main”方法的未命名实例的第二个初步实现,它可以省去公共/静态声明、传递参数数组以及与类声明关联的其他实体。 // 是 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // 现在你可以 void main() { System.out.println("Hello, World!"); }
  • 添加了 Scoped Values 的第二个预览实现,允许跨线程共享不可变数据以及在子线程之间有效交换数据(值是继承的)。正在开发 Scoped Values 来取代线程局部变量机制,并且在使用大量虚拟线程(数千或数百万线程)时效率更高。作用域值和线程局部变量之间的主要区别在于,前者只写入一次,以后不能更改,并且仅在线程执行期间保持可用。
  • 并行垃圾收集器在处理大型对象数组时提高了性能。通过优化,在一些具有大型对象数组的测试中,可以将开始搜索对象之前的延迟减少 20%。

此外,您还可以注意到发布了用于使用图形界面 JavaFX 22 创建应用程序的平台更新。

来源: opennet.ru

添加评论