Java 10 新特性解密,引入类型推断机制,2018 年 3 月 20 日发布

JDK 10 什么时候发布?

JDK 10 是 Java 10 标准版的部分实现,将于 2018 年 3 月 20 日发布,改进的关键点包括一个本地类型推断、一个垃圾回收的“干净”接口。
Oracle 已经为 Java 设定了六个月的发行计划。以前本打算根据发行的年份和月份命名升级版和后续版,这样的话第一个版本就会被称为 Java 18.3, 但这个计划后来被停止了。
如何下载 JDK 10?
用户要先加入早期使用者计划,而后才能够下载 JDK 10 测试版html

如何下载 JDK 10?

用户要先加入早期使用者计划,而后才能够下载 JDK 10 测试版java

http://jdk.java.net/10/linux

OpenJDK https://download.java.net/java/jdk10/archive/45/GPL/openjdk-10+45_linux-x64_bin.tar.gz编程

Oracle JDK https://download.java.net/java/jdk10/archive/45/BCL/jdk-10+45_linux-x64_bin.tar.gz安全

JDK 10 的主要功能包括:

一个局部变量类型推断,经过加强语言特性将类型推断扩展到局部变量,目的是减小与编码相关的“仪式”,同时保持对静态类型的安全承诺。架构

一个干净的垃圾收集器接口,用来改善垃圾收集器源代码之间的隔离效果,这样能够为HotSpot 虚拟机中的内部垃圾收集代码提供更好的模块化功能,也能够更容易向 HotSpot 添加新的垃圾收集器。oracle

并行、完整的 G1 垃圾收集器,经过实现并行性来改善最坏状况下的延迟问题。app

启用 HotSpot 将对象堆分配给用户指定的备用内存设备(如 NVDIMM 内存模块),这个特性也侧面预示了将来的系统可能会采用异构的内存架构。编程语言

在 Linux / x64 平台上以实验性方式启用基于 Java 的即时编译器(https://www.infoworld.com/art...)。模块化

将 JDK 的多个存储库合并成一个,简化开发。目前的代码库被分解成了多个库,容易出现源代码的管理问题。

应用程序数据共享,经过跨进程共享通用类的元数据,减小空间占用及启动时长。

线程本地握手,不执行全局 VM 安全点也能对线程执行回调,同时实现单线程中止回调。

JDK 提供了一组默认证书,开源 Java SE 的 CA程序,对开发人员更具吸引力。

新功能

与以前的JDK版本同样,对于即将到来的JDK 10也有一些主要特性。这些特性能够分为两个主要类别:(1)目标发布,(2)建议发布。前者表示某些特性已计划在JDK 10中发布,后一种类型表示这些特性还须要增长支持和成熟度。一旦条件容许,它就能够升级为一个目标发布状态。

目标发布

目前有两个主要功能针对JDK 10:

  • 局部变量类型推断,这将删除大部分对象实例化所需的冗长的包含手动类型信息
  • 整合源树source tree的JDK库,即不一样的JDK库将被合并成一个单一的存储库。

1. 局部变量类型推断

强类型编程语言有不少优势,包括在编译时发现类型错误,可是它们也引入了大量的样板代码,特别是在定义局部变量时。例如,当咱们但愿实例化一个对象时,咱们被迫在赋值的左侧提供显式类型,并在赋值的右边提供实现类型,以下面的片断所示:

MyObject value = new MyObject();

可是,当这个过程重复出现大量任务时,对象实例化可能变得使人沮丧和乏味。许多最流行的强类型的编程语言,好比C++, C#以及Go,在定义过程当中,提供一种局部变量类型推断的功能(例如C++提供了auto 关键字,C#提供var关键字)。可是,Java仍缺少这样的功能,它要求开发人员显式声明变量的预期清单类型。

为了解决这个问题,Java开发工具包(JDK)改进建议(JEP)286提出了一个上下文敏感的关键字var,容许局部变量被如下方式初始化:

var value = new MyObject();
var list = new ArrayList<MyObject>();

可是,当这个过程重复出现大量任务时,对象实例化可能变得使人沮丧和乏味。许多最流行的强类型的编程语言,好比C++, C#以及Go,在定义过程当中,提供一种局部变量类型推断的功能(例如C++提供了auto 关键字,C#提供var关键字)。可是,Java仍缺少这样的功能,它要求开发人员显式声明变量的预期清单类型。

为了解决这个问题,Java开发工具包(JDK)改进建议(JEP)286提出了一个上下文敏感的关键字var,容许局部变量被如下方式初始化:

var value = new MyObject();
var list = new ArrayList<MyObject>();

因为var关键字是上下文敏感的,它的使用有下面的规则定义:

代码使用var做为一个变量、方法或包名称时将不受影响;而使用var做为类或接口名称的代码将受到影响。

一样,类型推断将受到如下方式的约束:

推断类型将被限制在局部变量的初始化,加强的for循环索引,以及传统的for循环中声明;它(将)不用于方法形式、构造函数形式、方法返回类型、字段、捕获形式,或任何其余类型的变量声明。

考虑到全部的限制和细微差异,这个特性将有助于在开发人员建立的应用程序Java代码中减轻大量的单调无聊的动做,并简化JDK代码库。更多信息能够在官方的JEP 286规范中找到。

2. 整合的JDK库

目前,有8个不一样的Mercurial存储库用于存储包含JDK的大量源代码:

root
corba
hotspot
jaxp
jaxws
JDK
langtools
nashorn

虽然过多的存储库提供了对组成JDK的各类组件并清晰分离,但管理多个存储库存在一些主要的缺点。

其中最重要的一点是,在JDK的两个不一样部分,单个错误修复程序不能被原子跟踪。例如,若是一个bug修复须要对独立存储库中包含的系统的两个部分进行更改,那么必须提交两个提交:每一个存储库中一个。这种不连续性很容易地下降项目和源代码管理工具的可跟踪性和复杂性。

为了解决这个问题,JEP 296建议将全部现有存储库合并到一个Mercurial存储库中。这种合并的一个次生效应是,这个单一的Mercurial存储库比现有的8个存储库要更容易的被镜像(做为一个Git存储库)。

虽然在这个整合过程当中,外部开发人员有一些阻力,可是JDK开发团队彷佛已经致力于使这一更改为为JDK 10的一部分。有关更多信息,请参见JEP 296,并提议整合由Michael Redlich发布的JDK 10 OpenJDK Mercurial存储库声明。

建议发布

除了两个目标特性以外,JDK 10目前还有三个建议,其中两个主要是对JDK的垃圾收集器部分进行升级,另外一个侧重于对JDK的本地线程功能进行升级。

1 .清理垃圾收集接口

在当前的JDK结构中,组成垃圾收集器(GC)实现的组件分散在代码库的各个部分。尽管这些惯例对于使用GC计划的JDK开发者比较熟悉,但对新的开发人员来讲,对于特定GC的源代码,或者建立一个新的GC经常会感到困惑。更重要的是,随着Java modules的出现,咱们但愿在构建过程当中排除不须要的GC,可是GC接口的当前横切结构排除了这种加强。

JEP 304被设计为解决此问题的方案,并建议整合并清理GC接口,以便更容易地实现新的GC,并更好地维护现有的GC。本建议完成后,GC执行将负责提供如下内容:

  • heap,CollectedHeap的子类
  • barrier set,BarrierSet的子类,它实现了运行时的各类障碍
  • 一个CollectorPolicy的实现
  • GCInterpreterSupport的实现,它实现了解释器的GC的各类障碍(使用汇编指令)
  • GCC1Support的实现,它为C1编译器实现了GC的各类障碍
  • GCC2Support的实现,它为C2编译器实现了GC的各类障碍
  • 最终GC特定参数的初始化
  • 设置MemoryService、相关的内存池、内存管理器等。

有关这些更改的更多信息,请参见JEP 304规范;有关Java GC的更多信息,请参阅Oracle提供的垃圾收集器基础指南。

2. G1垃圾收集器并行化

随着JDK 9的发布,Garbage-First(G1)GC取代了Parallel Collector做为默认GC。为了减小JDK 9以外的JDK版本中垃圾收集的影响,G1收集器将被并行化(以匹配并行收集器的特征)。虽然目前尚未关于这个并行化的实现细节的信息,可是能够在JEP 307规范中找到关于此更改的更多细节。

有关GC实现的更多信息,请参阅Oracle的G1指南和并行收集器指南。

3. 项目线程局部握手

当前,中止Java线程是一个“所有或没有”的过程,须要一个Java虚拟机(JVM)的安全点,以使一个线程中止。为了让单独的线程中止,JEP 312提议将回调包含到线程中。这一更改受到了限制,由于它显著地提升了现有JVM功能的性能开销,而且改变了到达JVM全局安全点的现有时间语义。有关这个建议的更多信息,请参阅JEP 312的Thread-Local Handshake OpenJDK讨论。

结论

尽管JDK 9对于许多Java开发人员很是新鲜,但它的发展并无中止。特别是,JDK 10承诺为局部变量实例化引入类型推断机制,并将现有的JDK存储库合并到一个Mercurial存储库中。

此外,在更成熟和更支持的状况下,JDK 10还可能包括一些重要的升级到GC接口和默认的GC实现,以及升级到JVM中单个线程的可寻址能力。虽然JDK 10的发布在将来仍然相对较远,并且包含的特性极可能会成为Java时间轴上的一个重要里程碑。

来源:CodeBay :http://codebay.cn/post/6349.html

Contact

  • 做者:鹏磊
  • 出处:http://www.ymq.io
  • 版权归做者全部,转载请注明出处
  • Wechat:关注公众号,搜云库,专一于开发技术的研究与知识分享

关注公众号-搜云库

相关文章
相关标签/搜索