JDK 16:Java 16的新特性

标准Java最新升级的亮点包括原始类、密封类、记录、矢量API以及ARM64和Alpine Linux上的Windows端口。

JDK 16:Java 16的新特性
华盖创意

自3月16日起,Oracle的Java Development Kit(JDK)16现已作为生产版本提供。JDK16中的新功能包括密封类和记录的第二次预览,以及垃圾收集的并发线程堆栈处理。

JDK16是Java 16的参考实现,Java 16是标准Java的以下版本JDK 15型9月15日送达。JDK 16是一个由Oracle仅六个月支持的功能版本。JDK 17型,将于9月发布长期支持(LTS)。Oracle将JDK 16作为迁移到JDK 17的起点,用户可以在部署到JDK 16之前在JDK 16上进行测试。LTS每三年发布一次。

17项提案正式针对JDK 16。新功能包括:

  • 这个基于值的类建议的警告指定基元包装类为基于值的,不推荐删除其构造函数,并提示新的不推荐警告。对于在Java平台中任何基于值的类的实例上进行不正确的同步尝试,都会发出警告。推动这一努力的是瓦尔哈拉项目,它正在以原始类的形式对Java编程模型进行重大增强。基元类声明实例是无身份的,并且能够内联或扁平表示,其中实例可以在内存位置之间自由复制,并使用实例字段的值进行编码。Java中的原语类的设计和实现现在已经足够成熟,可以预期在未来的版本中会将Java平台的某些类迁移到原语类。移民候选人被非正式指定为基于值的类API规范。
  • 在JDK 15中预览,在JDK 16中再次预览,密封类接口限制了哪些其他类和接口可以扩展或实现它们。该计划的目标包括允许类或接口的作者控制负责实现它的代码,提供一种比访问修饰符更具声明性的方式来限制超类的使用,并通过为模式分析提供基础来支持模式匹配的未来方向。
  • 默认情况下,JDK内部构件的强封装,除了关键的内部API,例如杂项。不安全。用户可以选择自JDK 9以来默认的松散强封装。本提案的目标包括提高JDK的安全性和可维护性,作为Jigsaw项目,并鼓励开发人员从使用内部元素迁移到使用标准API,以便开发人员和最终用户都可以轻松地更新到未来的Java版本。这项提议确实存在现有Java代码无法运行的主要风险。鼓励开发人员使用jdeps工具识别依赖于JDK内部元素的代码,并切换到标准替换件如果可用。开发人员可以使用现有版本(如JDK11)通过使用--非法访问=警告识别通过反射访问的内部元素,使用--非法访问=调试找出错误代码,并使用进行测试--非法访问=拒绝
  • 外部链接器API,提供对本机代码的静态类型的pure-Java访问。该API将在JDK 16中处于孵化阶段。与提议的外部内存访问API一起,外部链接器API将大大简化绑定到本机库的过程,否则容易出错。该计划旨在用一个优秀的pure-Java开发模型取代JNI(Java Native Interface),以提供C支持,并且随着时间的推移,其灵活性足以支持其他平台,如32位x86,以及用C以外的语言编写的外部函数,如C++。性能应优于或可与JNI媲美。
  • 移动ZGC(Z垃圾收集器)线程堆栈处理从安全点到并发阶段。该计划的目标包括从ZGC安全点中删除线程堆叠处理;使堆栈处理变得懒惰、协作、并发和增量;从ZGC安全点中删除所有其他每线程根处理;并为其他HotSpot VM子系统提供延迟处理堆栈的机制。ZGC旨在使HotSpot中的GC暂停和可伸缩性问题成为过去。到目前为止,随着堆大小和元空间大小而扩展的GC操作已经从安全点操作转移到并发阶段。其中包括标记、重新定位、引用处理、类卸载和大多数根处理。GC安全点中仍在执行的唯一活动是根处理的子集和有时间限制的标记终止操作。这些根包含Java线程堆栈和其他线程根,这些根存在问题,因为它们随着线程数量的增加而扩展。要超越当前的情况,必须将每线程处理(包括堆栈扫描)转移到并发阶段。有了这个计划,改进延迟的吞吐量成本应该是微不足道的,典型机器上在ZGC安全点内花费的时间应该少于一毫秒。
  • 弹性亚空间功能,可以更快地将未使用的HotSpot VM类元数据(元空间)内存返回到操作系统,减少元空间占用,简化元空间代码以降低维护成本。Metaspace存在堆外内存使用率高的问题。该计划要求用基于buddy的分配方案替换现有的内存分配器,提供将内存划分为分区以满足内存请求的算法。这种方法已经在Linux内核等地方使用过,因此可以在较小的块中分配内存,以减少类装入器开销。碎片也将减少。此外,操作系统向内存管理领域的内存承诺将根据需要缓慢完成,以减少从大型领域开始但不立即使用或可能无法充分使用它们的加载程序的占用空间。为了充分利用伙伴分配提供的弹性,元空间内存将被安排成大小一致的颗粒,可以相互独立地提交和未提交。
  • 支持C++14语言功能,以允许使用C++14语言JDK C++源代码中的功能,并提供了在HotSpot VM代码中可以使用的这些功能的具体指导。通过JDK15,JDK中C++代码使用的语言功能仅限于C++98/03语言标准。使用JDK11,源代码得到了更新,以支持使用新版本的C++标准进行构建。这包括能够使用支持C++11/14语言功能的最新版本的编译器进行构建。本提案不建议对HotSpot之外使用的C++代码进行任何样式或用法更改。但为了利用C++语言的特性,需要根据平台编译器进行一些构建时更改。
  • 孵化器阶段的载体API其中JDK将配备培养箱模块,jdk.孵化器.vector,表示在支持的CPU体系结构上编译为最佳矢量硬件指令的矢量计算,以获得优于等效标量计算的性能。矢量API提供了一种用Java编写复杂矢量算法的机制,使用HotSpot VM中预先存在的矢量化支持,但用户模型使矢量化更具可预测性和健壮性。该提案的目标包括提供一个清晰简洁的API来表示一系列向量计算,通过支持多CPU体系结构实现平台识别,并在x64和AArch64体系结构上提供可靠的运行时编译和性能。优雅降级也是一个目标,在这个目标中,如果向量计算不能在运行时完全表示为硬件向量指令序列,那么向量计算将优雅降级,并且仍然可以运行,这可能是因为某个体系结构不支持某些指令,或者另一个CPU体系结构不受支持。
  • 将JDK移植到Windows/AArch64平台随着新的服务器类和消费类AArch64(ARM64)硬件的发布,Windows/AArch64因需求而成为一个重要的平台。虽然移植本身已经基本完成,但本提案的重点是将端口集成到主线JDK存储库中。
  • 将JDK移植到Alpine Linux以及在x64和AArch64体系结构上使用musl作为主要C库的其他Linux发行版。Musl是ISO C和Posix标准中描述的标准库功能的Linux实现。Alpine Linux由于其较小的映像大小,在云部署、微服务和容器环境中被广泛采用。Linux的Docker映像小于6MB。让Java在这样的环境中开箱即用,将允许Tomcat、Jetty、Spring和其他流行的框架在这些环境中以本机方式工作。通过使用jlink公司为了减少Java运行时的大小,用户可以创建一个更小的图像来运行特定的应用程序。
  • 提供记录类它充当不可变数据的透明载体。记录可以被视为标称元组。该版本中最广受期待的特性之一是通过减少样板代码来减少Java的仪式,记录在JDK14和JDK15中进行了预览。该计划的目标包括设计一个表示简单值聚合的面向对象构造,帮助开发人员专注于建模不可变的数据而不是可扩展的行为,自动实现数据驱动的方法,例如等于和访问器,并保留长期存在的Java原则,如标称类型和迁移兼容性。
  • 添加Unix域套接字通道其中,将Unix-domain(AF_Unix)套接字支持添加到nio.channels包中的套接字通道和服务器套接字信道API。该计划还扩展了继承的通道机制,以支持Unix域套接字通道和服务器套接字信道。Unix域套接字用于同一主机上的进程间通信。它们在大多数方面与TCP/IP套接字类似,只是它们是通过文件系统路径名而不是IP地址和端口号来寻址的。新功能的目标是支持在主要Unix平台和Windows上通用的Unix域套接字通道的所有功能。Unix域套接字通道在读/写行为、连接设置、服务器接受传入连接以及与选择器中的其他非阻塞可选通道多路复用方面的行为将与现有TCP/IP通道相同。对于本地进程间通信,Unix域套接字比TCP/IP环回连接更安全、更高效。
  • 外部内存访问API,允许Java程序安全访问Java堆外的外部内存。先前在JDK14和JDK15中孵化的外部内存访问API将在JDK16中重新构建,并进行了改进。已经进行了一些更改,包括在内存段内存地址接口。该提案的目标包括提供单个API来操作各种外部内存,包括本机内存、持久内存和托管堆内存。API不应破坏JVM的安全性。该提议的动机是许多Java程序访问外部内存,如Ignite、Memcached和MapDB。但JavaAPI并没有为访问外部内存提供令人满意的解决方案。
  • 模式匹配对于运算符操作符,在JDK 14和JDK 15中也进行了预览。它将在JDK 16中完成。模式匹配允许程序中的通用逻辑(即从对象中有条件地提取组件)更简洁、更安全地表达。
  • 提供jpackage工具来打包自包含的Java应用程序作为孵化工具引入JDK 14型,jpackage仍在JDK 15中孵化。有了JDK 16,jpackage就可以投入生产,支持本机包格式,为用户提供自然的安装体验,并允许在打包时指定启动时间参数。格式包括Windows上的msi和exe,MacOS上的pkg和dmg,Linux上的deb和rpm。可以直接从命令行或通过编程方式调用该工具。新的打包工具解决了这样一种情况,即许多Java应用程序需要以一流的方式安装在本机平台上,而不是放在类路径或模块路径上。需要一个适用于本机平台的可安装包。
  • OpenJDK源代码存储库从Mercurial迁移到Git推动这一努力的是版本控制系统元数据大小和可用工具以及托管方面的优势。
  • 迁移到GitHub,与Mercurial-to-Git迁移相关JDK 16源代码存储库将位于流行的代码共享站点针对Java 11和更高版本的.JDK功能版本和JDK更新版本将是该计划的一部分。Mercurial JDK和JDK沙箱的Git、GitHub和Skara过渡于9月5日完成,并开放供稿。  

Oracle JDK的下载可以在oracle.com网站。可在以下网址找到适用于Linux、Windows和MacOS的JDK 16开源版本jdk.java.net网站Oracle提供订阅到其标准Java版本,为平台提供支持。该公司指出,许多基于Java的技术,例如Apache Lucene搜索库、Apache Tomcat servlet容器和Gradle构建工具,已经支持JDK 16。

版权所有©2021 IDG Communications,Inc。