Java 9的JDK中值得期待的:不仅是模块化

简介:

【译者注】在本文中,作者介绍了即将在9.21发布的Java 9新特性,除了最重要的模块化以外,还涉及到编译,工具,协议,缓存等新特点,也提及了在此次版本中移除的功能,供Java爱好者阅读和参考。

以下为译文:

Java 9的JDK中值得期待的:不仅仅是模块化

在多次延期后,Java 9将于9月21日以Java开发工具包9的形式出现,这是自2014年3月以来,Java标准版的第一次重大升级。官方列出了JDK 9的大约90个新特性,模块化是最主要的一个。将Java重新配置成模块化格式,这项任务已经持续了多年,但在编译、代码缓存和JavaScript部署等领域也会有其他改进。

JDK 9的Java平台模块系统

Java 9最宝贵的特性,即模块化——以Java平台模块系统的形式——旨在将JDK分为运行、编译或构建时的一组模块。模块化被称为“可传递”的变化,这可以更好地理解跨模块的依赖关系。

Java 9的模块化方面包括应用程序打包、模块化JDK以及将源代码重新组织到模块中。在构建时,构建系统将强化编译模块并加强模块边界。JDK和Java运行环境(JRE)的镜像将被重构,以此来处理模块。同时,JavaFX UI控件和CSS API也将被模块化。

JDK 9将支持许多配置,可伸缩性、安全性和应用程序性能也会得到改进。将Java简化为小型设备是模块化工作的关键。Java平台模块系统,是 Jigsaw项目 的一个组件,也将被实现。

通过模块化,开发人员能够更好地为Java SE(标准版)和EE(企业版)构建和维护大型应用程序。但Oracle、IBM、Red Hat和其他公司关于如何在平台上做出彻底改变的问题上存在分歧。该模块系统在5月曾被否定,但在6月进行了第二次投票后,才获得批准。

关于模块化是否会对Java开发人员有着很大的好处,还存在争议,一些专家表示赞成,而另一些专家则不赞同。但不管怎样,Oracle一直在努力实现模块化平台。

为了实现模块化,已经多次延迟了Java 9的发布,因为Oracle一直在尝试更简单地迁移到Java 9,并且计划允许对类路径上的代码进行非法的反向访问,同时JRE会使用它来搜索类和资源文件。此功能将在Java 9之后被禁用。

在Java 9的JDK中编译

Java 9为编译代码提供了几种新功能,其中最主要的功能是提前编译。这个功能仍然处于实验阶段,此功能允许在虚拟机启动之前将Java类编译为本机代码。该特性旨在提高小型和大型应用程序的启动时间,同时对峰值性能几乎没有影响。

即时(JIT)编译器速度很快,但是Java程序已经变得如此之大,以至于JIT需要很长时间才能完全启动,这使得一些Java方法无法编译,性能也越来越弱。提前进行编译是为了解决这些问题。

但Java技术供应商Excelsior的市场总监Dmitry Leskov担心,这种时间上的编译技术还不够成熟,并希望Oracle能在Java 10后再推出更可靠的版本。

Java 9还实现了Oracle智能编译部署的第二阶段。这个特性包括改进javac工具的稳定性和可移植性,以便在JVM(Java虚拟机)能默认使用它。该工具也将被推广,因此它可以用于JDK之外的大型项目。

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

用Java编写的JVM编译器应该需要一个高质量的编译器,它比用C或c++编写的现有编译器更容易维护和改进。另外,现有支持Java编译器的项目有 Graal 和 Metropolis 。

新的编译器控制功能旨在控制JVM编译器的细粒度和方法依赖,让开发人员在运行时更改编译器控制选项,而又不会造成性能下降。该工具还可以为JVM编译器错误提供工作区。

Java 9的JDK还将更新javac编译器,这样它就可以编译Java 9程序,以运行在一些Java的旧版本上。

Java 9实现了REPL

Java 9将会有一个read-eval-print loop(REPL)工具——这是Java的另一个长期目标,经过多年的Kulia项目开发之后,在这个版本中它将变得真实。

Java 9的REPL被称为jShell,它交互式地评估声明语句和表达式。开发人员只需输入一些代码,就可以在编译之前获得对程序的反馈。

命令行工具的功能包括结束标签和自动添加所需的终端分号。jShell API允许在IDE和其他工具中使用jShell功能,尽管工具本身并不是IDE。

人们认为,缺乏REPL工具是院校越来越不愿授课Java的一个原因(Python和Scala等语言早就有REPL了)。Scala语言的创始人Martin Odersky质疑Java的REPL的实用性,他说Java是面向语句的,而REPL是面向表达式的。

JDK 9中实行代码缓存分段

JDK 9允许将代码缓存分成几个部分,以提高性能,并允许扩展(比如细粒度的锁)。由于专门的迭代器会跳过非方法代码,所以扫描时间需要被提高。分离非方法、异形和非异形码,提高一些基准测试的执行时间。

Java 9支持更多的标准

Java 9增加了对几个标准的支持。

新的HTTP/2 client API实现了HTTP/2协议,同时升级到Web的核心HTTP协议和WebSocket协议,基于浏览器的交互式通信。新的API可以替代HttpURLConnection API,HttpURLConnection API的问题是它包含已经失效的协议predating HTTP/1,这个太抽象,很难使用。但是,在JDK 9发布时,新的HTTP/2 API仍然处于beta测试阶段。

JDK 9还增加了对 HTML5 的支持。Javadoc API文档工具功能已经被增强,可以生成HTML5标记。

Java 9还将支持Unicode 8.0编码标准,该标准增加了8000个字符、10个模块和6个脚本。

对于安全性,Java 9为DTLS(数据包传输层安全性协议)添加了一个API。该协议的设计目的是防止在client/server通信中出现窃.听、篡改和消息伪造,这将为客户端和服务器模式提供一个安全模式。

JDK 9获得了更多的JavaScript支持(Nashorn项目)

Nashorn项目 是为了能让JavaScript在Java上进行高性能且轻量级的运行,这是在Rhino项目后的Netscape开始进行的。Nashorn项目负责在Java应用程序中嵌入JavaScript。其实在JDK 8中已经为Java提供了一个JavaScript引擎。

JDK 9将包括一个用于ECMAScript语法树的解析器API。API将通过IDE和服务器框架实现ECMAScript代码分析,而不依赖于Nashorn项目的内部实现类。

Java 9弃用和移除了哪些功能

Java 9弃用和移除一些不再流行的特性。其中最主要的是Applet API,它将被弃用。现在,安全浏览器已经取消了对Java浏览器插件的支持,因为这些已经过时了,HTML5的出现也加速了它们的灭亡。开发人员将转向到诸如Java Web Start这样的替代方案,用于在浏览器中启动应用程序或者安装应用程序。同时,appletviewer工具也被弃用了。

Java 9将弃用Concurrent Mark Sweep (CMS)垃圾收集器,并在未来的版本中停止支持它。其目的是加速在HotSpot虚拟机中的其他垃圾收集器的开发。低暂停G1垃圾收集器将是CMS的长期替代品。

与此同时,JDK 8中被弃用的垃圾收集组合将在JDK 9中删除。这之中包括很少使用的组合,如增量CMS、ParNew + SerialOld和DefNew + CMS,因为它们增加了垃圾收集器代码库的额外复杂度。

Java 9还将对import语句进行省略Java警告,以帮助大型代码库清除lint警告。在这些代码库中,对被弃用的功能,还会支持一段时间,而且如果是有目的地要使用一个被弃用的构造,那么导入弃用的构造就不需要发出警告消息。

在启动时通过多个JRE(mJRE)特性选择JRE的功能也被弃用。这种功能很少被使用,因为这会使Java启动器的实现变得更加复杂,并且在JDK 5中首次出现时,它从未被完全地实现。

Oracle正在删除JVM TI(工具接口)hprof(堆分析)代理,它已被JVM取代。jhat工具也被删除了,它已经被高级的堆可视化工具和分析器淘汰了。


作者:Paul Krill

来源:51CTO

相关文章
|
2月前
|
安全 Java
jdk9模块化
本文介绍了JDK 9引入的模块化系统,解释了模块化的概念、好处,包括提高安全性、可维护性和减少冲突及加快启动时间,并举例说明了如何使用module-info.java文件来定义模块依赖和暴露的包。
47 2
|
3月前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
72 2
|
28天前
|
安全 Java 编译器
JDK 10中的局部变量类型推断:Java编程的简化与革新
JDK 10引入的局部变量类型推断通过`var`关键字简化了代码编写,提高了可读性。编译器根据初始化表达式自动推断变量类型,减少了冗长的类型声明。虽然带来了诸多优点,但也有一些限制,如只能用于局部变量声明,并需立即初始化。这一特性使Java更接近动态类型语言,增强了灵活性和易用性。
105 53
|
21天前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
43 1
|
2月前
|
缓存 Java Maven
java: 警告: 源发行版 11 需要目标发行版 11 无效的目标发行版: 11 jdk版本不符,项目jdk版本为其他版本
如何解决Java项目中因JDK版本不匹配导致的编译错误,包括修改`pom.xml`文件、调整项目结构、设置Maven和JDK版本,以及清理缓存和重启IDEA。
54 1
java: 警告: 源发行版 11 需要目标发行版 11 无效的目标发行版: 11 jdk版本不符,项目jdk版本为其他版本
|
2月前
|
设计模式 Java API
[Java]静态代理与动态代理(基于JDK1.8)
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
30 0
[Java]静态代理与动态代理(基于JDK1.8)
|
2月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
27 1
|
2月前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
32 1
|
3月前
|
Oracle Java 关系型数据库
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
如果遇到"exec format error"问题,文章建议先检查Linux操作系统是32位还是64位,并确保安装了与系统匹配的JDK版本。如果系统是64位的,但出现了错误,可能是因为下载了错误的JDK版本。文章提供了一个链接,指向Oracle官网上的JDK 17 Linux版本下载页面,并附有截图说明。
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
|
3月前
|
Java API 开发者
【Java模块化新飞跃】JDK 22模块化增强:构建更灵活、更可维护的应用架构!
【9月更文挑战第9天】JDK 22的模块化增强为开发者构建更灵活、更可维护的应用架构提供了强有力的支持。通过模块化设计、精细的依赖管理和丰富的工具支持,开发者可以更加高效地开发和管理应用,提高应用的性能和可维护性。
96 10