Java 9的JDK中值得期待的:不仅仅是模块化
dmm33054
7年前
<p style="text-align: center;"><img src="https://simg.open-open.com/show/3572471300bbe9a3a13891ef02969eba.jpg"></p> <p>在多次延期后,Java 9将于9月21日以Java开发工具包9的形式出现,这是自2014年3月以来,Java标准版的第一次重大升级。官方列出了JDK 9的大约90个新特性,模块化是最主要的一个。将Java重新配置成模块化格式,这项任务已经持续了多年,但在编译、代码缓存和JavaScript部署等领域也会有其他改进。</p> <p><strong>JDK 9的Java平台模块系统</strong></p> <p>Java 9最宝贵的特性,即模块化——以Java平台模块系统的形式——旨在将JDK分为运行、编译或构建时的一组模块。模块化被称为“可传递”的变化,这可以更好地理解跨模块的依赖关系。</p> <p>Java 9的模块化方面包括应用程序打包、模块化JDK以及将源代码重新组织到模块中。在构建时,构建系统将强化编译模块并加强模块边界。JDK和Java运行环境(JRE)的镜像将被重构,以此来处理模块。同时,JavaFX UI控件和CSS API也将被模块化。</p> <p>JDK 9将支持许多配置,可伸缩性、安全性和应用程序性能也会得到改进。将Java简化为小型设备是模块化工作的关键。Java平台模块系统,是 <a href="/misc/goto?guid=4959754402505840017" rel="nofollow,noindex">Jigsaw项目</a> 的一个组件,也将被实现。</p> <p>通过模块化,开发人员能够更好地为Java SE(标准版)和EE(企业版)构建和维护大型应用程序。但Oracle、IBM、Red Hat和其他公司关于如何在平台上做出彻底改变的问题上存在分歧。该模块系统在5月曾被否定,但在6月进行了第二次投票后,才获得批准。</p> <p>关于模块化是否会对Java开发人员有着很大的好处,还存在争议,一些专家表示赞成,而另一些专家则不赞同。但不管怎样,Oracle一直在努力实现模块化平台。</p> <p>为了实现模块化,已经多次延迟了Java 9的发布,因为Oracle一直在尝试更简单地迁移到Java 9,并且计划允许对类路径上的代码进行非法的反向访问,同时JRE会使用它来搜索类和资源文件。此功能将在Java 9之后被禁用。</p> <p><strong>在Java 9的JDK中编译</strong></p> <p>Java 9为编译代码提供了几种新功能,其中最主要的功能是提前编译。这个功能仍然处于实验阶段,此功能允许在虚拟机启动之前将Java类编译为本机代码。该特性旨在提高小型和大型应用程序的启动时间,同时对峰值性能几乎没有影响。</p> <p>即时(JIT)编译器速度很快,但是Java程序已经变得如此之大,以至于JIT需要很长时间才能完全启动,这使得一些Java方法无法编译,性能也越来越弱。提前进行编译是为了解决这些问题。</p> <p>但Java技术供应商Excelsior的市场总监Dmitry Leskov担心,这种时间上的编译技术还不够成熟,并希望Oracle能在Java 10后再推出更可靠的版本。</p> <p>Java 9还实现了Oracle智能编译部署的第二阶段。这个特性包括改进javac工具的稳定性和可移植性,以便在JVM(Java虚拟机)能默认使用它。该工具也将被推广,因此它可以用于JDK之外的大型项目。</p> <p>另一个新的实验,编译特性是java级别的JVM编译器接口(JVMCI)。这个接口允许用Java编写的编译器被JVM用作动态编译器。JVMCI的API提供了访问VM结构、安装编译代码和插入JVM编译系统的机制。</p> <p>用Java编写的JVM编译器应该需要一个高质量的编译器,它比用C或c++编写的现有编译器更容易维护和改进。另外,现有支持Java编译器的项目有 <a href="/misc/goto?guid=4959754402612420573" rel="nofollow,noindex">Graal</a> 和 <a href="/misc/goto?guid=4959013859467506828" rel="nofollow,noindex">Metropolis</a> 。</p> <p>新的编译器控制功能旨在控制JVM编译器的细粒度和方法依赖,让开发人员在运行时更改编译器控制选项,而又不会造成性能下降。该工具还可以为JVM编译器错误提供工作区。</p> <p>Java 9的JDK还将更新javac编译器,这样它就可以编译Java 9程序,以运行在一些Java的旧版本上。</p> <p><strong>Java 9实现了REPL</strong></p> <p>Java 9将会有一个read-eval-print loop(REPL)工具——这是Java的另一个长期目标,经过多年的Kulia项目开发之后,在这个版本中它将变得真实。</p> <p>Java 9的REPL被称为jShell,它交互式地评估声明语句和表达式。开发人员只需输入一些代码,就可以在编译之前获得对程序的反馈。</p> <p>命令行工具的功能包括结束标签和自动添加所需的终端分号。jShell API允许在IDE和其他工具中使用jShell功能,尽管工具本身并不是IDE。</p> <p>人们认为,缺乏REPL工具是院校越来越不愿授课Java的一个原因(Python和Scala等语言早就有REPL了)。Scala语言的创始人Martin Odersky质疑Java的REPL的实用性,他说Java是面向语句的,而REPL是面向表达式的。</p> <p><strong>JDK 9中实行代码缓存分段</strong></p> <p>JDK 9允许将代码缓存分成几个部分,以提高性能,并允许扩展(比如细粒度的锁)。由于专门的迭代器会跳过非方法代码,所以扫描时间需要被提高。分离非方法、异形和非异形码,提高一些基准测试的执行时间。</p> <p><strong>Java 9支持更多的标准</strong></p> <p>Java 9增加了对几个标准的支持。</p> <p>新的HTTP/2 client API实现了HTTP/2协议,同时升级到Web的核心HTTP协议和WebSocket协议,基于浏览器的交互式通信。新的API可以替代HttpURLConnection API,HttpURLConnection API的问题是它包含已经失效的协议predating HTTP/1,这个太抽象,很难使用。但是,在JDK 9发布时,新的HTTP/2 API仍然处于beta测试阶段。</p> <p>JDK 9还增加了对 <a href="/misc/goto?guid=4959754402735370703" rel="nofollow,noindex">HTML5</a> 的支持。Javadoc API文档工具功能已经被增强,可以生成HTML5标记。</p> <p>Java 9还将支持Unicode 8.0编码标准,该标准增加了8000个字符、10个模块和6个脚本。</p> <p>对于安全性,Java 9为DTLS(数据包传输层安全性协议)添加了一个API。该协议的设计目的是防止在client/server通信中出现窃.听、篡改和消息伪造,这将为客户端和服务器模式提供一个安全模式。</p> <p><strong>JDK 9获得了更多的JavaScript支持(Nashorn项目)</strong></p> <p><a href="/misc/goto?guid=4959754402827833731" rel="nofollow,noindex">Nashorn项目</a> 是为了能让JavaScript在Java上进行高性能且轻量级的运行,这是在Rhino项目后的Netscape开始进行的。Nashorn项目负责在Java应用程序中嵌入JavaScript。其实在JDK 8中已经为Java提供了一个JavaScript引擎。</p> <p>JDK 9将包括一个用于ECMAScript语法树的解析器API。API将通过IDE和服务器框架实现ECMAScript代码分析,而不依赖于Nashorn项目的内部实现类。</p> <p><strong>Java 9弃用和移除了哪些功能</strong></p> <p>Java 9弃用和移除一些不再流行的特性。其中最主要的是Applet API,它将被弃用。现在,安全浏览器已经取消了对Java浏览器插件的支持,因为这些已经过时了,HTML5的出现也加速了它们的灭亡。开发人员将转向到诸如Java Web Start这样的替代方案,用于在浏览器中启动应用程序或者安装应用程序。同时,appletviewer工具也被弃用了。</p> <p>Java 9将弃用Concurrent Mark Sweep (CMS)垃圾收集器,并在未来的版本中停止支持它。其目的是加速在HotSpot虚拟机中的其他垃圾收集器的开发。低暂停G1垃圾收集器将是CMS的长期替代品。</p> <p>与此同时,JDK 8中被弃用的垃圾收集组合将在JDK 9中删除。这之中包括很少使用的组合,如增量CMS、ParNew + SerialOld和DefNew + CMS,因为它们增加了垃圾收集器代码库的额外复杂度。</p> <p>Java 9还将对import语句进行省略Java警告,以帮助大型代码库清除lint警告。在这些代码库中,对被弃用的功能,还会支持一段时间,而且如果是有目的地要使用一个被弃用的构造,那么导入弃用的构造就不需要发出警告消息。</p> <p>在启动时通过多个JRE(mJRE)特性选择JRE的功能也被弃用。这种功能很少被使用,因为这会使Java启动器的实现变得更加复杂,并且在JDK 5中首次出现时,它从未被完全地实现。</p> <p>Oracle正在删除JVM TI(工具接口)hprof(堆分析)代理,它已被JVM取代。jhat工具也被删除了,它已经被高级的堆可视化工具和分析器淘汰了。</p> <p> </p> <p>来自:http://www.iteye.com/news/32643</p> <p> </p>