Java SE 16 发布

经过六个月的开发,Oracle 发布了 Java SE 16(Java Platform,Standard Edition 16),它使用开源 OpenJDK 项目作为参考实现。 Java SE 16 保持了与 Java 平台以前版本的向后兼容性;所有以前编写的 Java 项目在新版本下启动时都将无需更改即可运行。 Java SE 16(JDK、JRE 和 Server JRE)的即用型安装版本专为 Linux(x86_64、AArch64)、Windows 和 macOS 准备。 Java 16 参考实现由 OpenJDK 项目开发,在 GPLv2 许可下完全开源,GNU ClassPath 例外允许与商业产品动态链接。

Java SE 16 被归类为一般支持版本,并将继续接收更新,直到下一个版本。 长期支持 (LTS) 分支应该是 Java SE 11,它将继续接收更新直到 2026 年。 下一个 LTS 版本计划于 2021 年 10 月发布。 让我们提醒您,从Java XNUMX发布开始,该项目切换到了新的开发流程,这意味着新版本的形成周期更短。 现在,新功能是在一个不断更新的主分支中开发的,其中包括现成的更改,并且每六个月从该分支分支一次以稳定新版本。

为了准备新版本,开发已从 Mercurial 版本控制系统转移到 Git 和 GitHub 协作开发平台。 此次迁移预计将提高存储库操作的性能,提高存储效率,提供对整个项目历史记录中更改的访问,改进对代码审查的支持,并使 API 能够实现工作流程自动化。 此外,Git 和 GitHub 的使用使得该项目对初学者和习惯 Git 的开发人员更具吸引力。

Java 16 的新特性包括:

  • 添加了带有 Vector API 实现的实验模块 jdk.incubator.vector,该模块提供了在 x86_64 和 AArch64 处理器上使用向量指令执行向量计算的函数,并允许同时将运算应用于多个值 (SIMD)。 与 HotSpot JIT 编译器中提供的标量操作自动向量化功能相比,新 API 允许您显式控制并行数据处理的向量化。
  • 用 C++ 编写的 JDK 和 VM HotSpot 代码允许使用 C++14 规范中引入的功能。 以前,允许使用 C++98/03 标准。
  • ZGC(Z垃圾收集器)以被动模式运行,尽可能减少垃圾收集造成的延迟,增加了并行处理线程堆栈的能力,而无需暂停应用程序线程。 ZGC现在只有需要暂停的工作,其延迟恒定,通常不超过几百微秒。
  • 向 SocketChannel、ServerSocketChannel 和 java.nio.channels 类添加了对 Unix 套接字 (AF_UNIX) 的支持。
  • 已经使用标准 C 库 musl 为 Linux 发行版 Alpine 实现了一个端口,该库在容器、微服务、云和嵌入式系统环境中很流行。 在此类环境中建议的端口允许您像常规应用程序一样运行 Java 程序。 此外,使用 jlink,您可以删除所有未使用的模块并创建足以运行应用程序的最小环境,这允许您创建特定于应用程序的紧凑映像。
  • 实现了Elastic Metaspace机制,优化了JVM HotSpot中类元数据(元空间)占用内存的分配和返回操作。 使用弹性元空间可以减少内存碎片,减少类加载器开销,并且由于可以更快地将未使用的类元数据占用的内存返回给操作系统,因此对长时间运行的服务器应用程序的性能也有有益的影响。 为了选择卸载类后的内存释放模式,提供了选项“-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)”。
  • 已为在具有基于 AArch64 架构的处理器的硬件上运行的 Windows 系统添加了 JDK 端口。
  • 已经提出了外部内存访问 API 的第三个预览版,允许 Java 应用程序通过操作新的 MemorySegment、MemoryAddress 和 MemoryLayout 抽象来安全、高效地访问 Java 堆外部的内存区域。
  • 实验性的外部链接器 API 已经实现,提供从 Java 到本机代码的访问。 与外部内存 API 一起,新的编程接口使得在传统共享库上创建包装器变得更加容易。
  • 添加了 jpackage 实用程序,它允许您为独立的 Java 应用程序创建包。 该实用程序基于 JavaFX 的 javapackager,允许您以各种平台本机格式创建包(Windows 为 msi 和 exe,macOS 为 pkg 和 dmg,Linux 为 deb 和 rpm)。 这些包包含所有必需的依赖项。
  • 默认情况下启用所有 JDK 内部的严格封装,但关键 API(例如 sun.misc.Unsafe)除外。 “--illegal-access”选项的值现在默认设置为“deny”而不是“permit”,这将阻止代码访问大多数内部类、方法和字段的尝试。 要绕过限制,请使用“-illegal-access=permit”选项。
  • “instanceof”运算符中模式匹配的实现已经稳定,这允许您立即定义一个局部变量来引用检查的值。 例如,您可以立即编写“if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}”,而无需显式定义“String s = (String) obj”。 是: if (obj instanceof Group) { Group group = (Group) obj; var 条目 = group.getEntries(); 现在你可以不用定义“Group group = (Group) obj”: if (obj instanceof Group group) { varentries = group.getEntries(); }
  • “record”关键字的实现已经稳定,为类定义提供了一种紧凑的形式,在存储数据的情况下无需显式定义各种低级方法,例如 equals()、hashCode() 和 toString()仅在其不改变的字段中。 当类使用 equals()、hashCode() 和 toString() 方法的标准实现时,它可以不需要它们的显式定义: public record BankTransaction(LocalDate date, double amount, String description) {}

    除了构造函数和 getter 方法之外,此声明还会自动添加 equals()、hashCode() 和 toString() 方法的实现。

  • 第二个草案是针对密封类和接口提出的,这些类和接口不能被其他类和接口用来继承、扩展或重写实现。 密封类还提供了一种比访问修饰符更具声明性的方法来限制超类的使用,基于显式列出允许扩展的子类。 包 com.example.geometry; 公共密封类 Shape 允许 com.example.polar.Circle、com.example.quad.Rectangle、com.example.quad.simple.Square {…}

来源: opennet.ru

添加评论