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