关于java:译文全新首发JDK-16全部新特性

40次阅读

共计 8246 个字符,预计需要花费 21 分钟才能阅读完成。

封面:洛小汐
译者:潘潘

JDK 8 的新个性都还没摸透,JDK 16 的新个性就提着刀来了。

郑重申明:

第一次冒险翻译业余畛域的文献,可想而知,成果特地蹩脚。个别翻译文献特地是 技术业余畛域 的内容,因为波及到很多专业术语、业内常用语,很多词汇你在翻译软件基本找不到,并且大部分知识点技术都是成体系的、互相关联的、多版本迭代的、有历史起因的等等,因而要求你自身必须分明每个技术点的前因后果和逻辑关系,否则翻译起来特地消耗工夫精力,因为一直翻阅参考文献理解学习和斟酌琢磨,但其实徒劳无功,因为很多你到最初还是没看明确。而此次翻译的 JDK 16 新个性 文献内容,的确是难上之难。

所以,本次翻译的内容仅供参考,自己已尽力翻译整顿,如有翻译破绽或让大家产生误解的中央,请给予了解,并欢送随时斧正,交换。

前言

到 2021 年 3 月,下一版本的 Java 降级公布将聚焦在原始类、密封类、记录类、矢量类接口,以及用于 Windows ARM64 和 Alpine Linux 的端口上。

JDK 16 新增了基于值的类正告和密封类(第二次预览)作为打算性能,还退出了一系列新的个性,从内部链接程序 API,到模式匹配,再到用于垃圾回收的并发线程堆栈解决。

JDK 16 将是继 9 月 15 日公布的 JDK 15 之后,一个规范的 Java 版本参考实现。拟定公布打算是在 2020 年 12 月 10 日和 2021 年 1 月 14 日别离两次进入提案解冻阶段,随后在 2021 年 2 月 4 日和 2 月 18 日公布两个预览版本。生产版本预计在 2021 年 3 月 16 日正式公布。

纵观 JDK 史:


  • JDK 1.0

    • 1996-01-23 公布
  • JDK 1.1

    • 1997-02-19 公布
  • JDK 1.2

    • 1998-12-04 公布
  • JDK 1.3

    • 2000-05-08 公布
  • JDK 1.4

    • 2002-02-13 公布
    • 正则表达式,异样链,NIO,日志类,XML 解析器,XLST 转换器
  • JDK 1.5/5.0

    • 2004-09-30 公布
    • 主动装箱、泛型、动静注解、枚举、可变长参数、遍历循环
  • JDK 1.6/6.0

    • 2006-04 提供动静语言反对、提供编译 API 和卫星 HTTP 服务器 API,改良 JVM 的锁,同步垃圾回收,类加载
  • JDK 1.7/7.0

    • 2011-07-28 公布
    • 提供 GI 回收器、增强对非 Java 语言的调用反对(JSR-292, 降级类加载架构
  • JDK 1.8/8.0

    • 2014-03-18 公布
    • Lambda 表达式、办法援用、默认办法、新工具、Stream API、Date Time API、Optional 类、Nashorn, JavaScript 引擎
  • JDK 9.0

    • 2017-09-21 公布
    • JShell、不可变汇合工厂办法、模块零碎、http 协定 2.0 版本、Process API/CompletableFuture API/Optional Class/Stream API 加强、匿名外部类的钻石操作符、默认 G1 垃圾回收器、try 语句语法改良
  • JDK 10.0

    • 2018-03-21 公布
    • JIT 编译器、局部变量类型援用、数据类型共享、并行 GC、root 证书、javah 工具、堆调配
  • JDK 11.0

    • 2018-09-25 公布
    • 单命令运行 Java 文件、Lambda 参数局部变量语法、基于嵌套访问控制、动静类文件常量、误操作垃圾回收器、删除 Java EE 和 CORBA 模块、ChaCha20 与 Poly1305 加密算法、Aarch64 加强、ZGC 试用、弃用 Nashorn JS 引擎
  • JDK 12.0

    • 2019-03-19 公布
    • JVM 加强、Switch 表达式、文件 mismatch() 办法、String 新办法 indent()/transform()/describeConstable()/resolveConstantDesc()、JVM 常量 API、instanceof 模式匹配
  • JDK 13.0

    • 2019-09-17 公布
    • 反对编写文本块、Switch 表达式加强、重构遗留的 Socket API、勾销提交未应用内存、动静 CDS 存档、反对 Unicode 12.1、DOM 和 SAX 工厂反对命名空间
  • JDK 14.0

    • 2020-03-17 公布
    • 空指针异样加强提醒、Switch 表达式(规范)、instanceof 模式匹配(预览)、Records 类(预览)、文本块(第二次预览)、打包工具(孵化)、JFR 事件流、ZGC (反对 macOS 和 Windows)、内部存储器拜访 API(孵化)
  • JDK 15.0

    • 2020-09-15 公布
    • 密封类(预览)、instanceof 模式匹配(第二次预览)、Records 类(第二次预览)、文本块(规范)、暗藏类、删除 Nashorn JS 引擎、重构遗留的 DatagramSocket API、内部存储器拜访 API(第二次孵化)、弃用 RMI 激活、移除 Solaris 和 SPARC 的端口
  • JDK 16.0

    • 2020-12-10 第一次提案解冻
    • 2021-01-14 第二次提案解冻
    • 2021-02-04 公布第一个预览版本
    • 2021-02-18 公布第二个预览版本
    • 2021-03-16 正式公布

截至 2020 年 12 月 1 日,JDK 16 有 15 项 正式提案,另外基于值的类正告和密封类(第二次预览) 2 项 仍处于“针对指标提案”阶段。

Java 16 的新个性包含:

1、基于值的类正告提议 将原始包装类指定为基于值的类,同时不举荐通过提醒新弃用正告促使用户将其构造函数移除。在 Java 平台中对于任何基于值的类实例进行同步的谬误尝试,会予以正告。推动这一致力的是 Valhalla 我的项目,该我的项目正在以原始类的模式对 Java 编程模型进行重大改良。原始类将实例申明为无身份的,并且能够内联或展平示意模式,其中实例能够在内存地位之间自在复制,并能够应用实例字段的值进行编码。Java 中原始类的设计和实现当初曾经足够成熟,能够预感,在未来的发行版中会把 Java 平台的某些类迁徙至原始类。这些打算迁徙的类在 API 标准中将被设计成 基于值的类

2、之前在 JDK 15 中进行过预览,密封类 和接口限度了能够扩大或实现它们的类和接口。这项打算的指标包含:容许类或接口的创建者管制负责实现它的代码,提供比拜访修饰符更申明性的形式来限度超类的应用,并通过提供模式分析根底来反对模式匹配的将来倒退。

3、默认状况下,JDK 内部结构是强封装的 ,而要害外部 API(例如 misc.Unsafe)除外。自 JDK 9 以来默认容许用户抉择应用宽松的强封装。作为 Jigsaw 我的项目 的一部分,此提案的指标包含进步 JDK 的安全性和可维护性,并激励开发人员从间接应用外部元素逐步迁徙为应用规范 API,这样开发人员和最终用户都能够轻松地降级到 Java 的将来版本。该倡议的确存在次要危险,即现有版本的 Java 代码将无奈运行。激励开发人员应用 jdeps 工具来辨认代码中依赖的 JDK 外部元素,并在可用时切换到 规范代替版本。开发人员能够应用现有的发行版(如 JDK 11)来测试现有代码,通过应用 –illegal-access=warn 来辨认通过反射拜访的外部元素,应用 –illegal-access=debug 来定位谬误的代码,并应用 –illegal-access=deny 来进行测试。

4、反对动态类型的纯 Java 形式拜访本地代码的 内部链接程序 API。该接口在 JDK 16 中处于孵化阶段,与被提案的内部存储拜访接口一起,内部链接程序接口将会大大减少像其余形式绑定本地库容易出错的状况。这项打算目标在于通过用更高级的纯 Java 开发模式来替换 JNI(Java 本机接口),以提供与 C 语言的交互,并随着工夫的推移,它将更加灵便并适配反对其它平台(例如 32 位的 x86 架构)和其余非 C 语言编写的内部函数(例如 C ++ 编写的内部函数)。它的性能将会比 JNI 更加优越。

5、将 ZGC(可扩大的低提早垃圾收集器)线程堆栈解决 从平安点移至并发阶段。该打算的指标包含从 ZGC 平安点中删除线程堆栈解决,使堆栈解决变得懒性、协同、并发和增量,从 ZGC 平安点移除所有其它繁多线程的 root 解决,并为其它虚拟机子系统提供了一种提早解决堆栈的机制。ZGC 旨在使 HotSpot 中的 GC 暂停和可伸缩性问题成为过来。到目前为止,随着堆大小和元空间大小变动而伸缩的 GC 操作曾经从平安点操作中移除,并迁到并发阶段,它们包含标记,重定位,援用解决,类卸载和大多 root 解决。GC 平安点中惟一仍保留执行的是子集 root 解决和限时标记终止操作。这些 root 解决包含 Java 线程堆栈和其它线程 root,因为它们会随线程数量而伸缩所以会存在问题。要打消这些问题,每个线程的解决(包含堆栈扫描)必须挪动到并发阶段。通过这项打算,晋升提早的吞吐老本将会微不足道,并且在典型计算机上 ZGC 平安点外部花销的工夫将会少于 1 毫秒。

6、弹性元空间性能 可将未应用的 HotSpot 虚拟机类元数据(元空间)占用的内存更迅速地返回给操作系统,从而缩小元空间占用并简化元空间代码以升高保护老本。元空间存在大量的堆外内存应用问题。该项打算呐喊采纳内存分区调配计划来替换现有的内存分配机制,提供一种将内存划分为多个分区以满足内存申请的算法。这种办法已在许多中央应用(例如 Linux 内核等),它将使得在较小块中分配内存以缩小类加载器开销的形式变得可行,碎片化也将缩小。此外,从操作系统到内存治理区域,记忆内存都将被提早、按需应用,以缩小加载程序占用的空间,这些加载程序从大型区域开始占用,但又不立刻应用它们或可能无奈充分利用它们。为了充分利用分区调配所提供的弹性,将元空间内存排列成大小统一的颗粒,这些颗粒能够彼此独立地进行提交和不提交。

7、启用 C ++ 14 语言性能,以容许在 JDK C++ 源代码中应用 C++ 14 性能,并提供对于这些容许在 HotSpot 虚拟机代码中应用的性能的具体指南。通过 JDK 15,咱们晓得在 JDK 中 C++ 代码应用的语言个性已限于 C++ 98/03 语言规范。自 JDK 11,源代码就已降级为反对应用更新版本的 C ++ 规范进行构建。这包含可能应用反对 C++ 11/14 语言性能的最新版本的编译器进行构建。这项提案不举荐对在 HotSpot 之外应用的 C ++ 代码款式或用法进行更改,然而要利用 C ++ 语言的个性,一些构建时的更改是必须的,这取决于平台编译器。

8、孵化阶段的矢量 API,是 JDK 中装备的一个孵化模块 jdk.incubator.vector,用于表白矢量计算————编译为所反对的 CPU 架构上的最佳硬件指令。以实现优于等同标量计算的性能。矢量 API 提供了一种应用 Java 编写简单矢量算法的机制,该机制应用 HotSpot 虚拟机中事后存在的反对连同一套用户模型进行矢量化,使其更可预测且更具健壮性。该提案的指标包含提供一个清晰简洁的 API 来表白一系列向量计算,通过反对多个 CPU 架构实现平台无关性,以及在 x64 和 AArch64 架构上提供牢靠的运行时编译和性能。优雅降级也是一个指标,在这个指标中,如果向量计算在运行时不能齐全示意为硬件向量指令序列,那么向量计算将优雅地降级,并且依然能够失常工作,起因可能是某个架构不反对某些指令,或者是其它 CPU 架构不受反对。

9、将 JDK 移植到 Windows/AArch64 平台。随着新的服务器级和消费类 AArch64(ARM64)硬件的公布,加上需要起因 Windows/AArch64 曾经成为一个重要的平台。尽管移植自身曾经根本实现,但该项提案的重点是将端口集成到主线 JDK 库中。

10、在 x64 和 AArch64 架构上,将 JDK 移植到 Alpine Linux 和其余应用 musl 作为其次要 C 库的 Linux 发行版。Musl 是 ISOC 和 Posix 规范中形容的规范库性能的 Linux 实现。Alpine Linux 因为镜像较小而被广泛应用于云部署、微服务和容器环境中。Linux 版本的 Docker 容器镜像小于 6MB。让 Java 在这种设置中开箱即用,并容许 Tomcat、Jetty、Spring 和其它风行的框架在本机环境中失常工作。通过应用 jlink 来缩小 Java 运行时的大小,用户能够创立一个更小的镜像,以运行特定的应用程序。

11、[提供记录类,作为不可变数据的通明载体。记录类能够认为是名义元组。记录类在 JDK 14 和 JDK 15 中进行了预览。此做法是为了回应无关 Java 过于简短拘束的埋怨。该打算的指标包含设计一个示意简略值汇合的面向对象的结构器,帮忙开发人员专一于对不可变数据的建模而不是扩大行为,主动实现数据驱动的办法(例如 equals 和 accessors),并保留长期的 Java 准则,例如名义类型。

12、Unix-Domain 套接字通道 的增加,其中 Unix-Domain(AF_UNIX)套接字反对被增加到 nio.channels 包中的套接字通道和服务器套接字通道 API 中。该打算还扩大了继承的通道机制,以反对 Unix-Domain 套接字通道和服务器套接字通道。Unix-Domain 套接字用于同一主机上的过程间通信。它们在大多数方面与 TCP/IP 套接字相似,除了它们是通过文件系统路径名而不是 IP 地址和端口号寻址的。新性能的指标次要是反对 Unix 平台和 Windows 通用的 Unix-Domain 套接字通道的所有性能。Unix-Domain 套接字通道在读取 / 写入行为,连贯设置,服务器对传入连贯的承受以及在选择器中与其余非阻塞可选通道的复用方面将与现有的 TCP/IP 通道雷同。Unix-Domain 套接字比用于本地,过程间通信的 TCP/IP 回送连贯更平安,更高效。

13、内部存储器拜访 API,容许 Java 程序平安地拜访 Java 堆以外的内部存储器。内部存储器拜访 API,以前在 JDK 14 和 JDK 15 中都进行过孵化,将来在 JDK 16 中将再次孵化,并加以改进。改进范畴包含在 MemorySegment 和 MemoryAddresses 接口之间划分更明确的角色。此项提案的指标包含提供一个能够在各种内部存储(包含本机,长久化介质以及托管堆存储器)上运行的 API。该 API 不会对虚拟机的安全性造成威逼。该项提案的动机是为了让很多 Java 程序拜访内部存储,像 Ignite、Memcached 以及 MapDB。遗憾的是 Java API 还没有令人满意的拜访内部存储的解决方案。

14、在 JDK 14 和 JDK 15 中都已预览过 instanceof 操作符的 模式匹配,它将在 JDK 16 中最终确定。模式匹配使程序中的通用逻辑(即从对象中有条件地提取组件)得以更简洁、平安的表白。

15、提供一款名为 jpackage 的工具,用于独立打包 Java 应用程序。jpackage 在 JDK 14 中被作为孵化工具引入,并在 JDK 15 中仍处于孵化阶段。到了 JDK 16,jpackage 将投入生产,反对本地的软件包格局,从而为用户提供天然的装置体验,并容许在打包时指定启动时参数。反对的格局包含 Windows 上的 msi 和 exe,MacOS 上的 pkg 和 dmg 以及 Linux 上的 deb 和 rpm。该工具能够间接从命令行或以编程形式调用。新的打包工具解决了这样一种状况:许多 Java 应用程序须要以全局可用的形式装置在本机平台上,而不是简略地搁置在类门路或模块门路上。因而提供适宜本机平台的可装置软件包十分有必要。

16、OpenJDK 源代码仓库从 Mercurial 迁徙至 Git。推动这一致力会在几方面体现劣势:版本控制系统元数据大小方面、可用工具方面以及托管方面。

17、迁徙到 GitHub,这个变动是基于 OpenJDK 源代码库从 Mercurial 迁徙到 Git,JDK 16 源代码仓库将呈现在风行的代码共享网站上。Mercurial JDK 和 JDK-sandbox 迁徙到 Git、GitHub 和 Skara 的过渡工作已于 9 月 5 日实现,现已向用户凋谢。

在网站 jdk.java.net 中能够下载到实用于 Linux、Windows 和 MacOS 的 JDK 16 晚期测试版本。和 JDK 15 一样,JDK 16 也会是一个短期版本,仅反对六个月。而打算在 2021 年 9 月公布的 JDK 17 将会是一个长期反对(LTS)版本,并取得数年的反对。以后的长期反对(LTS)版本是 2018 年 9 月公布的 JDK 11

总结

置信很多企业或集体,目前都还在应用 JDK 8 这个长期保护版本,最新一个长期保护版本是 JDK 11,预计应用的人群也还不是特地多,因为对于企业 / 集体来说,版本升级的老本太大了,往往咱们更加须要的是零碎可能稳固平安运作,哪怕是须要就义一部分性能。从 JDK8 开始,Java 语言就越显得更加具备攻击性和包容性,版本升级速度和周期也是极其惊人,现在短短几年,已是 JDK 16,所以自己特地看好 Java 在将来市场的占比和技术能力的继续延长,加油,Java 们。

References

[1] JDK 16: https://www.infoworld.com/art…
[2] JDK 15: https://www.infoworld.com/art…
[3] 基于值的类正告提议: https://openjdk.java.net/jeps…
[4] Valhalla 我的项目: https://openjdk.java.net/proj…
[5] 基于值的类: https://docs.oracle.com/en/ja…
[6] 密封类: https://openjdk.java.net/jeps…
[7] JDK 内部结构是强封装的: https://openjdk.java.net/jeps…
[8] Jigsaw 我的项目: https://openjdk.java.net/proj…
[9] 规范代替版本: https://wiki.openjdk.java.net…’sinternalAPIs
[10] 内部链接程序 API: https://openjdk.java.net/jeps…
[11] ZGC(可扩大的低提早垃圾收集器)线程堆栈解决: https://openjdk.java.net/jeps…
[12] 弹性元空间性能: https://openjdk.java.net/jeps…
[13] 启用 C ++ 14 语言性能: https://openjdk.java.net/jeps…
[14] C++ 14: https://www.infoworld.com/art…
[15] 孵化阶段的矢量 API: https://openjdk.java.net/jeps…
[16] 将 JDK 移植到 Windows/AArch64 平台: https://openjdk.java.net/jeps…
[17] JDK 移植到 Alpine Linux : https://openjdk.java.net/jeps…
[18] jlink: https://openjdk.java.net/jeps…
[19] 提供记录类: https://openjdk.java.net/jeps…
[20] Unix-Domain 套接字通道: https://openjdk.java.net/jeps…
[21] 内部存储器拜访 API: https://openjdk.java.net/jeps…
[22] 模式匹配: https://openjdk.java.net/jeps…
[23] 提供一款名为 jpackage 的工具,用于独立打包 Java 应用程序: https://openjdk.java.net/jeps…
[24] JDK 14: https://www.infoworld.com/art…
[25] OpenJDK 源代码仓库从 Mercurial 迁徙至 Git: https://openjdk.java.net/jeps…
[26] 迁徙到 GitHub: https://openjdk.java.net/jeps…
[27] JDK 16 源代码仓库将呈现在风行的代码共享网站上: https://www.infoworld.com/art…
[28] jdk.java.net: https://jdk.java.net/16/
[29] JDK 11: https://www.infoworld.com/art…

BIU ~ 文章继续更新,微信搜寻「潘潘和他的敌人们」第一工夫浏览,随时有惊喜。本文会在 GitHub https://github.com/JavaWorld 收录,热腾腾的技术、框架、面经、解决方案,咱们都会以最美的姿态第一工夫送达,欢送 Star。

正文完
 0