JDK 9闭关修炼三年,带来了哪些让人耳目一新的变化和功能呢?

时隔JAVA8发布3年后,JAVA9才迟迟地走到我们面前。你可以说, Java 9 带来了很多颠覆性的新功能。甲骨文最近透露, Java 版本的命名也会随着时间的推移变化。从现在起, java 计划每6个月的发布节奏, 下一个主要版本, 在截止 2018年3月分,将发布,其版本号为 java 18.3,随后是 六月后,2018年9月份,将会发布 java 18.9。Java 的新发布节奏也意味着 JDK 9 不会被指定为长期的版本。相反, 下一个长期版本将是 Java 18.9。Java 更快的发布节奏意味着开发人员不必等待很长时间才能发布主要版本。这也预示着新的功能也会越来越成熟。言归正传,那么这次新版本带来了哪些新的特性和重大变革呢? 让我们先来一睹为快,绝对值得收藏纪念。

模块化带来的变革

Java 9 以 Java 模块的形式,将 JDK 分成一组组的模块, 用于在运行、编译或生成时进行组合。模块化可以传递并理解跨域模块的依赖关系。

模块化应该让开发人员更容易地组装和维护复杂的应用程序。此外, 它还应使 Java 能够更好地扩展到较小的设备, 同时提高安全性和性能。

Java 9 的模块化方面包括应用程序打包、模块 JDK 本身, 以及将源代码重新整合到模块中。重新调整 JDK 和 Java 运行时环境 (JRE) 映像以处理模块。此外, JavaFX UI 控件和 CSS API 现在可用于模块化。

为了使迁移到模块化的 Java 9 更容易, java 9 允许对类路径上的代码进行非法的反射访问, JRE 用于搜索类和资源文件。在 Java 9 之后, 此功能将不被允许。

Java 9 代码的编译器改进

Java 9 升级功能为编译代码提供了几个新功能, 其中首要的是时间提前 (AoT) 编译。仍处于实验阶段, 此功能允许在虚拟机中启动 Java 类到本机代码的编译。此功能旨在提高小型和大型应用程序的启动时间, 对峰值性能的影响有限。

实时 (JIT) 编译器速度很快, 但是 java 程序变得非常大, JIT 完全预热需要很长时间, 使得一些 java 方法编译并削弱了性能。提前编译是为了解决这些问题。

另一个新的实验编译功能是 Java 级的 JVM 编译器接口 (JVMCI)。此接口允许用 Java 编写的编译器被 JVM 用作动态编译器。JVMCI 的 API 提供了访问 VM 结构、安装已编译代码和插入 JVM 编译系统的机制。

在 Java 中编写 JVM 编译器应该允许一个比用 c 或 c++ 编写的现有编译器更易于维护和改进的高质量编译程序。因此, 用 Java 编写的编译器应该更易于维护和改进。

一个新的编译器控制功能旨在提供对 JVM 编译器的细粒度和方法上下文相关的控制, 让开发人员在运行时更改编译控制选项, 而不会降低性能。该工具还为 JVM 编译器 bug 启用了变通方法。

REPL 终于来到了 Java 9

用过Python的童鞋都知道,Python 中的读取-求值-打印循环( Read-Evaluation-Print Loop )很方便。它的目的在于以即时结果和反馈的形式。

命令行工具的功能包括制表符完成和自动添加所需的终端分号。jShell API 允许 ide 和其他工具中的 jShell 功能, 尽管该工具本身不是 IDE。

Java 9 中流 API 的增强功能

在 Java 9 中, 流 API 添加以有条件地从流中删除项, 遍历流元素, 并从可空值创建流的方法, 同时支持扩展,以用作流源的 Java SE API 集。

代码缓存可以在 Java 9 中划分为段

JDK 9 允许将代码缓存划分为段以提高性能并允许扩展 (如细粒度锁定)。由于专用迭代器跳过非方法代码, 因此应改进扫描时间;分离非方法、异型和非异型代码;并改进一些基准的执行时间。

HTTP/2 客户端 API 来到 Java 9

JDK9之前提供HttpURLConnection API来实现Http访问功能,但是这个类基本很少使用,一般都会选择Apache的Http Client,此次在Java 9的版本中引入了一个新的package:java.net.http,里面提供了对Http访问很好的支持,不仅支持Http1.1而且还支持HTTP2,以及WebSocket,据说性能特别好。

DTLS 安全 API 添加到 Java 9 中

为了安全, Java 9 为 DTLS 添加了一个 API (数据报传输层安全性)。该协议旨在防止客户端/服务器通信中的窃听、篡改和邮件伪造。为客户端和服务器模式提供了实现。


什么是 Java 9 不推荐和删除的功能

Java 9 不推荐或删除了一些不再流行的功能。其中最主要的 Applet API, 这是不推荐的。由于安全意识的浏览器制造商一直在删除对 Java 浏览器插件的支持, 现在已经过时了。HTML5 的到来也加速了他们的灭亡。开发人员现在被引导到诸如 Java Web 启动、从浏览器启动应用程序或可安装应用程序等替代方案。

appletviewer 工具也被删除了。

Java 9 支持在将来的版本中停止对并发标记扫描 (CMS) 垃圾回收器的使用。其目的是加快热点虚拟机中其他垃圾收集器的开发。低停顿 G1 垃圾回收器将来会取代 CMS 。

同时, jdk 8 中以前弃用的垃圾回收组合将被删除。其中包括很少使用的组合, 如增量 cms、ParNew + SerialOld 和 DefNew + CMS, 这增加了垃圾回收器代码库的额外复杂性。

在 Java 9 中也删除了通过多个 JRE (mJRE) 功能在启动时选择 JRE 的能力。该功能很少使用, 复杂的 Java 启动器的实现, 它从来没有完全记录, 当它首次亮相 JDK 5。

Oracle 已经删除了 jvm TI (工具接口) hprof (堆分析) 代理, 它已在 jvm 中被取代。jhat 工具也被删除了, 并已被高级堆可视和分析器废弃。

后记

写作分享不易,您的收藏,关注和留言是我前进的最大动力;

如果你有任何疑问需要探讨,欢迎在文章末尾留言,我尽量在第一时间个大家回复。