- 「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」。
- 当然 不论新老朋友 我相信您都可以 从中获益。如果觉得 「不错」 的朋友,欢迎 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力!
特性总览
以下是 Java 10 中的引入的部分新特性。关于 Java 10 新特性更详细的介绍可参考这里。
- 基于时间的发行版本控制(JEP 322)
- 局部变量类型推断(JEP 286)
- 试验性 JIT 编译器(JEP 317)
- 应用程序类数据共享(JEP 310)
- 用于 G1 的并行 Full GC(JEP 307)
- 清理垃圾收集器接口(JEP 304)
- 其他 Unicode 语言标签扩展(JEP 314)
- 根证书(JEP 319)
- 线程本地握手(JEP 312)
- 备用存储设备上的堆分配(JEP 316)
- 删除本机头生成工具——javah(JEP 313)
- 将JDK森林合并到单个存储库中(JEP 296)
- API 变更
一. 基于时间的发行版本控制(JEP 322)
发行版本号的前世今生
自 Java 江山易主,JDK 发行版本的字符串命名方式一直是一个耐人寻味的话题。
单就下载 JDK 时,所看到的简短版本字符串形式来说,在 7u40
版本之前,u
之后的数字,代表了 JDK 发布以来的第几个修正版本,然而 Oracle 改变规则,为了彰显出安全之类的重大 修补(Cirtical Patch Updates)版本,采用 奇数 命名,而 Bug 修复、API 修改之类的 维护版本,则采用 偶数。(另有版本号 $MAJOR.$MINOR.$SECURITY
的格式来区分 Bug 修正和 API 修改)
为此,之前既有的 JDK 6/7 发布版本,还被重新命名。(下方演示)
Actual Hypothetical
Release Type long short
------------ ------------------------
Security 2013/06 1.7.0_25-b15 7u25
Minor 2013/09 1.7.0_40-b43 7u40
Security 2013/10 1.7.0_45-b18 7u45
Security 2014/01 1.7.0_51-b13 7u51
Minor 2014/05 1.7.0_60-b19 7u60
就结论而言,重新命名之后,从 7u9
、6u37
开始,就可以从奇偶数来判别是否为重大修补版本;至于 7u40
之后的版本,重大修补版本 是基于 5
的倍数,遇偶数加一,而 维护版本 则会是 20
的倍数。如此(不直观)的命名方式,被规范在了 JEP223 中。(随着 JDK 9 一起发布的)
然而,自 JDK 8 发布之后,Oracle 的 Java 架构师 Mark Reinhold 就希望,未来 Java 发布可以基于时间,以半年为周期,持续发布新版本,让一些有用的小特性,也能被开发者使用,因此,JEP 223 的规范就不再适用了,而在 JDK 9 发布后,他们针对新版本曾经提出过基于 $YEAR.$MONTH
格式,然而收到了社区极大的反对,为此,还提出了三个替代方案,收集各方的意见。(https://goo.gl/7CA8B3)
那么,Java 下一个特性版本是 8.3
?1803
?还是 10
?调查结果显示,社群大多数都支持 10
,Stephen Colebourne 也发出请求(https://goo.gl/i5J44T),并表示 Java 不像 Ubuntu 这类操作系统,基于 $YEAR.$MONTH
并不合适。
最终,Oracle 采用了 $FEATURE.$INTERIM.$UPDATE.$PATCH
这样的方案,并规定在了 JEP 322 中。
JEP 322 新模式解读
通过采用基于时间的发行周期,Oracle 更改了 Java SE 平台和 JDK 的版本字符串方案以及相关的版本信息,以适用于当前和将来的基于时间的发行模型。
版本号的新模式是:
$FEATURE.$INTERIM.$UPDATE.$PATCH
- $ FEATURE:计数器将每
6
个月递增一次,并基于功能发布版本,例如:JDK 10,JDK 11。 - $ INTERIM:对于包含兼容错误修复和增强功能但没有不兼容更改的非功能版本,计数器将增加。通常,这将是零,因为六个月内不会有任何临时发布。这保留了对发布模型的将来修订。
- $ UPDATE:计数器将增加,用于解决安全问题,回归和较新功能中的错误的兼容更新版本。此功能会在功能发布后一个月更新,此后每三个月更新一次。2018 年 4 月版本是
JDK 10.0.1
,7 月版本是JDK 10.0.2
,依此类推 - $ PATCH:计数器将增加以用于紧急释放以解决严重问题。
并添加了新的 API 以通过编程的方式获取这些计数器:
Version version = Runtime.version();
version.feature();
version.interim();
version.update();
version.patch();
现在,让我们来看一下返回版本信息的 Java 启动器:
$ java -version
java version "10" 2018-03-20
Java(TM) SE Runtime Environment 18.3 (build 10+46)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)
版本号格式为 10
,因为没有其他计数器为零。发布日期已添加。可以将 18.3
理解为 Year 2018&3rd Month,版本 10 + 46
是版本 10
的 46
版本。对于 JDK 10.0.1
的假设版本 93
,版本将为 10.0.1 + 93
。
因此,对于 Java 9 来说,目前可以看到的版本,会是 9.0.4
这样的格式,至于 2018 年 3 月发布的特性版本为 10
,到了 9
月提供的新版本,就是 11
,JDK 11 预计会是长期支援版本,所以,在版本字串上,也会特别显示 LTS(long-term sup