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工具也被删除了,它已经被高级的堆可视化工具和分析器淘汰了。
Java 9的JDK中值得期待的:不仅仅是模块化的更多相关文章
- OpenJDK源码研究笔记(十五):吐槽JDK中的10个富有争议的设计
前14篇文章,分享了JDK中值得学习和借鉴的编码和设计方法. 每个硬币都是有两面的.Every coin has two sides. 当然,JDK中也有很多值得改进或者说富有争议的设计. 本篇,就来 ...
- JDK中日期和时间的几个常用类浅析(二)
java.util.Calendar JDK中的java.util.Calendar类主要是用来处理日期和时间相关的算法运算.当你需要做一些关于日期和时间的高级算数操作时,此类可能就是你的最好选择 ...
- 观察者模式--java jdk中提供的支持
一.简介 观察者设计模式有如下四个角色 抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者.抽象主题提供一个接口,可以增加和删除观察者角色.一般用一个抽象 ...
- 关于Java JDK中 URLDecoder.decode 方法
java.net.URLDecoder.decode 在项目中碰到了个比较奇怪的问题,就是我在本地使用java.net.URLDecoder.decode(ruleName)方法解码,没有问题,本地的 ...
- 列出JDK中常用的Java包
列出JDK中常用的Java包 1.java.lang 2.java.sql 3.java.io 4.java.math 5.java.text 6.java.net 7.java.util 8.jav ...
- 初探Java设计模式4:JDK中的设计模式
JDK中设计模式 本文主要是归纳了JDK中所包含的设计模式,包括作用和其设计类图.首先来个总结,具体的某个模式可以一个一个慢慢写,希望能对研究JDK和设计模式有所帮助.一.设计模式是什么(1)反复出现 ...
- Java并发(10)- 简单聊聊JDK中的七大阻塞队列
引言 JDK中除了上文提到的各种并发容器,还提供了丰富的阻塞队列.阻塞队列统一实现了BlockingQueue接口,BlockingQueue接口在java.util包Queue接口的基础上提供了pu ...
- Java并发编程:JDK中的阻塞队列
上次我们讲了一些常用的4个阻塞队列,但是在JDK中还提供了其他的一些阻塞队列.这篇文章将全面介绍一下JDK中的所有阻塞队列,并比较他们的区别. JDK7提供了7个阻塞队列.分别是 ArrayBlock ...
- JDK中枚举的底层实现
前提 上一篇文章复习介绍了JDK中注解的底层实现,跟注解一样比较常用,但是底层实现比较神秘的还有枚举类型.趁着国庆假期的最后两天,把JDK中枚举的底层实现也进行一次探究. 通过例子查找本质 在探究JD ...
随机推荐
- FileZilla使用
FileZilla是一个免费开源的FTP软件,分为客户端版本和服务器版本,具备所有的FTP软件功能.可控性.有条理的界面和管理多站点的简化方式使得Filezilla客户端版成为一个方便高效的FTP客户 ...
- centos7提示ifconfig command not found解决
安装centos7时,选择了minimal install的话,没有安装网络组件. yum install net-tools 可以解决问题.
- ACM零散知识
定理与方法专区: 1.两点间的曼哈顿距离如果为偶数,那么两点间可以走偶数步到达 2.求小于等于n 的素数的个数.(即欧拉函数) 100=(2^2)*(5^2) num[100]=(2+1)*(2 ...
- ruby中的链式访问和方法嵌套
先看一道题,这道题是codewars上的一道题,我很早就看到了,但是不会写.等到又看到这道题的时候,我刚看完元编程那本书,觉得是可以搞定它的时候了.废话不多说,先看这道题,题目最开始是为JavaScr ...
- iOS 性能监测
给些链接: http://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ%3D%3D&idx=1&mid=207890859&scene=23& ...
- sift算法特征点如何匹配?
https://www.zhihu.com/question/23371175 我需要把一张照片和训练集中的图片进行匹配.我把一张照片提取特征值并建立kd树,然后把训练集的图片依次读进来,然后把图片的 ...
- Django学习笔记之利用Form和Ajax实现注册功能
一.注册相关的知识点 1.Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面建一个forms.py的文件来存放 2 ...
- 20145329 《Java程序设计》第九周学习总结
教材学习内容总结 十六章 1.Metadata即"诠读数据的数据",数据库是用来存储数据的地方,然而数据库本身产品名称为何?数据库中有几个数据表格?表格名称为何?表格中有几个字段等 ...
- 20145331 《Java程序设计》第10周学习总结
20145331 <Java程序设计>第10周学习总结 教材学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置 ...
- [LOJ6145]Easy
题意给出一棵树,每次询问一个点$x$到编号在$[l,r]$中的点的距离的最小值.$n,q\le 10^5$ 大概是最简单的动态点分治了,注意开大数组即可,如果改成求最大值这道题会有意思很多 代码: # ...