Oracle正式发布Java 9,引入新的Java编程组件

Java SE 9.0于2017年9月21日发布。JDK 9的核心变化就是引入了一种新的Java编程组件,也就是模块,按照Oracle的说法,它是一个可命名的、自描述的代码和数据集合。模块技术的核心目标是减小Java应用和Java核心运行时环境的大小与复杂性。为此,JDK自己进行了模块化,Oracle但愿经过这种方式提高性能、安全性和可维护性。shell

为了支持Java 9的模块,引入一种新的模块化JAR文件形式,按照这种形式会在其根目录中包含一个module-info.class文件。Oracle同时提供了工具,容许咱们组合和优化一组模块,造成自定义的运行时镜像(image),这样的镜像没必要将整个Java运行时包含进来。模块化所带来的其余变化包括从Java运行时镜像中移除了rt.jar和tools.jar。编程

Java社区进程(JCP)执行委员会的成员Ben Evans认为最急需重构的应用刚好就是最适合进行模块化的应用。若是你已经备受Lava Flow/God Class/Stovepipe System地狱的折磨,并且你的利益相关方明确知道这一点,那么你可能更容易说服他们进行一次完整的底层重构,经过渐进式的努力造成一个完成的模块解决方案(而不是简单重构并迁移至Java 8)是值得去作的。安全

Oracle宣布Java 8会是一个长期支持的发布版本,会一直支持到2022年,所以Evans认为不少的应用将会停留在Java 8上,根本不会升级到Java 9。Evans补充说,有些应用可能会让开发和构建工具链使用Java 8版本,而在生产环境使用Java 9的运行时。模块化

对特定类型的应用来讲,这是颇有帮助的。例如,我曾经见到有的电子商务网站具备很是大的堆空间,其中包含了大约40G的字符串数据。Java 9的ompact Strings技术可以将这种类型的内存使用减半。这反过来又会对GC的性能带来积极的影响。对于有些应用来讲(这可能就包括大型的Solr安装环境及相似场景),单单这一项收益就值得将运行时升级到Java 9。工具

Java 9使用G1做为默认的垃圾收集器,替代了以前默认使用的Parallel GC。Evans对这项变化的评论:
这项变动是很重要的,由于相对于Parallel来讲,G1会在应用线程上作更多的事情,而Parallel几乎没有在应用线程上作任何事情,它基本上彻底依赖GC线程完成全部的内存管理。这意味着切换到G1将会为应用线程带来额外的工做,从而直接影响到应用的性能。oop

在不少(甚至能够说大多数)场景中,这种额外的性能损耗都不是什么问题。可是,在这方面,我确实也曾经见过从Parallel切换到G1时,有必定比例的工做负载会引发性能的降低。对于这些应用来讲,这种性能降低是没法接受的,因此他们没法切换至G1收集器。随着G1成为默认的收集器,这将会影响到升级至Java 9的每一个应用。布局

JClarity的CEO Martijn Verburg认为大型的代码库须要重构为模块的形式。Verburg给出了一些通用的模块化建议,而且指出了开发人员在采用Java 9模块系统时,须要注意的一些事情:
阅读Paul和Sander的图书“Java 9 modularity”:它是本权威指南,提到了全部须要注意的地方,阐述了模块、包以及JAR之间如何运行的关联关系;
在模块边界的地方,使用定义良好的接口而且针对这些接口编程;
不要拆分包(split package),也就是说一个包不要分散到两个模块中。Adopt OpenJDK有个探测工具,咱们能够用它来探测已有的代码;
确保不要存在循环依赖(Jigsaw不容许这样);
模块在源码的布局上与咱们已习惯的方式有所不一样,须要确保构建工具可以进行对应的处理;
Jigsaw不支持多版本。性能

按照Verburg的说法,核心要点在于处理循环依赖、拆分包的问题,并确保针对接口进行编码。在尝试使用Jigsaw模块化重构以前,针对已有的代码库,这些工做须要预先完成。他还澄清了一个误解,那就是只有模块化的应用才能在Java 9上运行。优化

因为误解,在这方面有一种FUD(恐惧、不肯定和怀疑)情绪,有人误认为在Java 9上运行的必须是模块化的应用。事实并不是如此,咱们能够将已有的基于类路径的应用直接在Java 9上运行。这里会有一些新的安全限制,所以咱们须要设置一些特定的运行时标记(除非你重构代码,使用更安全的方式来访问Java的内部资源),即使如此,默认的行为也只是警告,而不是彻底阻止咱们(Java 10的限制会更严格)。网站

Verburg认为Jigsaw会是一个基石,会让Java的演进更快,这要归功于Mark Reinhold、Alan Bateman、Mandy Chung以及Jigsaw团队的其余成员多年来不知疲倦的工做,正是他们的努力使这一切得以实现。

Java 9还引入了jshell工具。这个命令行环境为Java平台带来了读入-求值-打印-循环(Read-Eval-Print-Loop,REPL)功能。它的目的在于以即时结果和反馈的形式,简化原型的实现并帮助咱们探索语言在编码时的可选项。

Verburg和Evans看到Java 9中包含了jShell都很是兴奋,但令他们失望的是,HTTP/2只是做为Java 9的一个孵化模块(incubator module)提供的。鉴于社区对这项特性的兴趣和提供的帮助,Evans认为Oracle应该投入足够的工程资源,将HTTP/2交付为GA版本。

JDK 9完整的变动列表能够在Oracle的站点上查阅。Oracle宣布会按照每六个月一次的节奏进行发布,意味着Java 9是最后一次“keystone”特性驱动的版本发布,这反映出了Oracle目前管理Java的特色。Java下一阶段的演化将会按照更短的发布周期而且会按照更加面向特性的方式来发布。Java是否依然可以在服务端技术中占据领导者地位尚有待观察。

相关文章
相关标签/搜索