http://www.ox-holdings.com

所以 Java 10 的变更将通过 JEP,随着Java开发工具包(JDK)9的发布

摘要北京时间 3 月 21 日,Oracle 官方宣布 Java 10 正式发布。这是 Java 大版本周期变化后的第一个正式发布版本,非常值得关注。引言北京时间 3 月 21 日,Oracle 官方宣布 Java 10 正式发布。这是 Java 大版本周期变化后的第一个正式发布版本(详见这里),非常值得关注。你可以点击以下地址即刻下载: 9 月,Oracle 将 Java 大版本周期从原来的 2-3 年,调整成每半年发布一个大的版本。而版本号仍延续原来的序号,即 Java 8、Java 9、Java 10、Java 11.....但和之前不一样的是,同时还有一个版本号来表示发布的时间和是否为 LTS(长期支持版本),比如 Java 10 对应 18.3。如下示例:/jdk-10/bin$ ./java -versionopenjdk version "10" 2018-03-20OpenJDK Runtime Environment 18.3 (build 10+46)OpenJDK 64-Bit Server VM 18.3 (build 10+46, mixed mode)需要注意的是 Java 9 和 Java 10 都不是 LTS 版本。和过去的 Java 大版本升级不同,这两个只有半年左右的开发和维护期。而未来的 Java 11,也就是 18.9 LTS,才是 Java 8 之后第一个 LTS 版本(得到 Oracle 等商业公司的长期支持服务)。这种发布模式已经得到了广泛应用,一个成功的例子就是 Ubuntu Linux 操作系统,在偶数年 4 月的发行版本为 LTS,会有很长时间的支持。如 2014 年 4 月份发布的 14.04 LTS,Canonical 公司和社区支持到 2019 年。类似的,Node.js,Linux kernel,Firefox 也采用类似的发布方式。Java 未来的发布周期,将每半年发布一个大版本,每个季度发布一个中间特性版本。这样可以把一些关键特性尽早合并入 JDK 之中,快速得到开发者反馈,可以在一定程度上避免 Java 9 两次被迫推迟发布日期的尴尬。下图为 2017 年 JavaOne 大会时,Oracle 公开的未来 Java 版本发布和支持周期图。Java 10 新特性这次发布的 Java 10,新带来的特性并不多。根据官网公开资料,共有 12 个 JEP(JDK Enhancement Proposal 特性加强提议),带来以下加强功能:JEP286,var 局部变量类型推断。JEP296,将原来用 Mercurial 管理的众多 JDK 仓库代码,合并到一个仓库中,简化开发和管理过程。JEP304,统一的垃圾回收接口。JEP307,G1 垃圾回收器的并行完整垃圾回收,实现并行性来改善最坏情况下的延迟。JEP310,应用程序类数据 (AppCDS) 共享,通过跨进程共享通用类元数据来减少内存占用空间,和减少启动时间。JEP312,ThreadLocal 握手交互。在不进入到全局 JVM 安全点 (Safepoint) 的情况下,对线程执行回调。优化可以只停止单个线程,而不是停全部线程或一个都不停。JEP313,移除 JDK 中附带的 javah 工具。可以使用 javac -h 代替。JEP314,使用附加的 Unicode 语言标记扩展。JEP317,能将堆内存占用分配给用户指定的备用内存设备。JEP317,使用 Graal 基于 Java 的编译器,可以预先把 Java 代码编译成本地代码来提升效能。JEP318,在 OpenJDK 中提供一组默认的根证书颁发机构证书。开源目前 Oracle 提供的的 Java SE 的根证书,这样 OpenJDK 对开发人员使用起来更方便。JEP322,基于时间定义的发布版本,即上述提到的发布周期。版本号为$FEATURE.$INTERIM.$UPDATE.$PATCH,分别是大版本,中间版本,升级包和补丁版本。部分特性说明1. var 类型推断。这个语言功能在其他一些语言 (C#、JavaScript) 和基于 JRE 的一些语言 (Scala 和 Kotlin) 中,早已被加入。在 Java 语言很早就在考虑,早在 2016 年正式提交了 JEP286 提议。后来举行了一次公开的开发者调查,获得最多建议的是采用类似 Scala 的方案,“同时使用 val 和 var”,约占一半;第二多的是“只使用 var”,约占四分之一。后来 Oracle 公司经过慎重考虑,采用了只使用 var 关键字的方案。有了这个功能,开发者在写这样的代码时:ArrayList myList = new ArrayList()可以省去前面的类型声明,而只需要var list = new ArrayList()编译器会自动推断出 list 变量的类型。对于链式表达式来说,也会很方便:var stream = blocks.stream(); ... int maxWeight = stream.filter(b -> b.getColor() == BLUE) .mapToInt(Block::getWeight) .max();开发者无须声明并且 import 引入 Stream 类型,只用 stream 作为中间变量,用 var 关键字使得开发效率提升。不过 var 的使用有众多限制,包括不能用于推断方法参数类型,只能用于局部变量,如方法块中,而不能用于类变量的声明,等等。另外,我个人认为,对于开发者而言,变量类型明显的声明会提供更加全面的程序语言信息,对于理解并维护代码有很大的帮助。一旦 var 被广泛运用,开发者阅读三方代码而没有 IDE 的支持下,会对程序的流程执行理解造成一定的障碍。所以我建议尽量写清楚变量类型,程序的易读维护性有时更重要一些。2. 统一的 GC 接口在 JDK10 的代码中,路径为 openjdk/src/hotspot/share/gc/,各个 GC 实现共享依赖 shared 代码,GC 包括目前默认的 G1,也有经典的 Serial、Parallel、CMS 等 GC 实现。3. 应用程序类数据(AppCDS)共享CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS(Application Class-Data Sharing) 支持。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。我们可以想像为类似于操作系统的休眠过程,合上电脑时把当前应用环境写入磁盘,再次使用时就可以快速恢复环境。

引用作者|Ben Evans编辑|薛命灯在过去的 2017 年中,Java 世界中发生了许多前所未有的变化,其部分原因在于 Java 9 的推出,尽管它推后了近一年的时间。然而,随着时间的推移人们可能会发现,推出 Java 9 版本的意义,远没有随该新版本一并推出的 Java 版本发布周期变更为每六个月一次的意义更为重大。Java 版本发布周期的变更,意味着在 2018 年将会推出两个 Java 新版本,而非一个。2018 年将推出的第一个新版本称为 Java 10,第二个新版本是 Java 11。虽然这一命名方案与现有命名看上去毫无二致,但是新版本只有经过重大公开辩论并达成最终共识后,才能得以推出。鉴于新版本的推出将切换到这样一种严格按时间点的节奏,预计这将使每个新版本中发布的 Java 特性,比迄今为止所能看到的范围更为缩减。就 Java 10 而言,这意味着新特征的数量将相当之少。InfoQ 先前曾报道了 Java 10 中的主要特性,一会也会再说。此后,该版本中添加特性的仅是一些细微的、清理性质的、实验性质的,或是当前为利基性质的 (对异构内存架构的支持)。至于 Java 11 中考虑了哪些功能,目前更是云山雾罩。我们只能确认下列几个功能在考虑范围内:Epsilon。一种对 Null 垃圾回收算法的参考实现。Dynamic Class File Constants 。一种主要针对软件库编写人员及使用动态特性 invokedynamic 高级开发人员的平台特性。运行时追踪 JIT 编译事件。一旦发布日期临近,该特性列表肯定会被填满。但是值得注意的是,列表中目前尚未提及 Java 值类型。这也许并不出乎意料,因为实现值类型需要对 Java 语言和运行时做重大更改,并对 Java 类型系统做完全重构。尽管当前原型已工作,但是距特性交付尚有很长的路要走。当前状态只适用于低级别的平台开发人员,以及那些习惯于使用基于反射或 MethodHandle 工具的开发人员。看上去令人不可思议的是,尽管值类型将作为 Java 11 的一部分发布,但是 Oracle 依然尚未对该特性预期于何时发布公开发表任何评论。但是,如果值类型并未作为 Java 11 的一部分提供,这将会产生连锁反应。包含值类型的首个长期支持版本将不会在 2021 年 9 月前发布。在撰写本文时,我们尚不清楚已在提案中的数据类特性是否会出现在 Java 11 中。正如 Java 语言架构师 Brian Goetz 所介绍的:引用数据类将用于解决类的表示与 API 合约间存在的复杂间接关系。通过使用数据类,编译器可以填入一些常规类成员。数据类提案与 Scala 的 Case 类具有一些相似之处。但是 Goetz 明确指出,数据类的设计空间中还存在一些可能的变动,该特性的整体语义含义要比目前我们能看到的更为深入。目前的数据类概念是与同处于开发过程中的模式匹配特性深度关联在一起的。但是,这两个特性可能会在不同的版本中提供。与上面两个特性都相关的是,未来可能对 Switch 形式做改进。Switch 语句块将可作为表达式或声明使用。该特性相对较小,有望在 Java 11 中交付,即便数据类或模式匹配特性尚未实现。但目前情况看,该特性仍然是一个 JEP 草案。最终将于 9 月发布的版本,其特性完成日期是 2018 年 6 月。因此,在 Java 11 的整体形态浮出水面之前,我们必须再等待数月时间。说回到 Java 10,它的新特性还在确认当中,所以从现在到 GA 版中间还是有可能加入重大的变更。不管怎样,在这四个月里,开发者还是可以期待一些新的特性能够被添加到 Java 10 中。新的特性和增强一般通过 Java Enhancement Process或 Java Community Process 标准请求进行跟踪。因为 Java 10 的时间线较短,范围也相对较小,所以 Java 10 的变更将通过 JEP 进行跟踪。有望被包含在 Java 10 中的特性是那些已经处于 Targeted 或 Proposed 状态的 JEP,它们包括:286:本地变量类型推断296:统一 JDK 仓库304:垃圾回收器接口307:G1 的并行 Full GC310:应用程序类数据共享312:ThreadLocal 握手机制JEP 296 是一次纯粹的清理工作,而 JEP 304 加强了不同垃圾回收器的代码隔离,并为垃圾回收器引入更简洁的接口。JEP 304 意味着厂商可以更自由地选择特定的 GC 算法来构建 JDK,因为现在有多种处于开发当中的 GC,如 Shenandoah、ZGC 和 Epsilon,在未来可以使用这些 GC 算法。社区也在努力弃用甚至移除 Concurrent Mark Sweep垃圾回收器,只是目前还没有可用的替代品。比较有意思的变更或许是 JEP 286,增强的本地变量类型推断可以让开发者免去很多变量申明模板代码。也就是说,在下一个版本中,下面的变量声明是合法的:

图片 1

从 2018 年开始,JDK 的发布周期将由以前的数年一个大版本变化为 6 个月一个小版本。按照这个节奏,2017 年 9 月发布了 Java 9,半年后的 2018 年 3 月 20 日将发布 Java 10,而 JDK 11 将于 2018 年 9 月发布。

随着Java开发工具包(JDK)9的发布,大量的注意力都集中在Java的最新特性上,包括引入模块(通过集成项目Jigsaw)。尽管最近的很多关注都集中在这些强大的新功能上,但下一个版本的Java:JDK 10已经开始准备了。在本文中,我们将粗略地介绍一下JDK 10的主要特性,并探讨JDK 10中可能包含的一些特性。

var list = new ArrayListString(); // infers ArrayListStringvar stream = list.stream(); // infers StreamString

期待已久,没有跳票的 Java 10 已正式发布!你可以通过这里下载 Java 10 正式版。

JDK 10

Java 10 按照新的节奏不会有大量更新,仅包含 12 个 JEP。

286: Local-Variable Type Inference
296: Consolidate the JDK Forest into a Single Repository
304: Garbage-Collector Interface
307: Parallel Full GC for G1
310: Application Class-Data Sharing
312: Thread-Local Handshakes
313: Remove the Native-Header Generation Tool (javah)
314: Additional Unicode Language-Tag Extensions
316: Heap Allocation on Alternative Memory Devices
317: Experimental Java-Based JIT Compiler
319: Root Certificates
322: Time-Based Release Versioning

编号为 286 的 JEP 引入了局部变量类型推断。Java 将引入 var 关键字,支持由编译器根据代码进行推断,来确定局部变量的类型。如下的代码,list 和 stream 变量都可以简化类型声明。

var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>

编号为 307 的 JEP 引入了 G1 的多线程版本。G1 是 JDK 9 的默认垃圾回收器,在 Full GC 时采用了单线程标记-清理-压缩算法,而在 JDK 10 将支持多线程算法以提高性能。

从 JDK 10 开始,将采用新的版本号,格式为 $FEATURE.$INTERIM.$UPDATE.$PATCH。其中:

$FEATURE :功能版本号,代表一次功能发布,每 6 个月增加一次,在 JDK 10 中 $FEATURE 即为 10;

$INTERIM :过渡版本号,一般为 0,用于功能变化不大的兼容升级;

$UPDATE :更新版本号,$FEATURE 更新后一个月递增,然后每三个月递增;

$PATCH :紧急发布版本号,解决关键问题的紧急发布才递增;

图片 2

这种语法只限于初始化过的本地变量和 for 循环中的本地变量。它其实是个语法糖,在语义上并没有任何变化。不过,该特性有可能在 Java 开发者当中引起热议。其他三个变更都将在性能方面带来一些影响。JEP 307 解决了 G1 垃圾回收器的一个问题——截止到 Java 9,G1 的 Full GC 采用的是单线程算法。也就是说,G1 在发生 Full GC 时会严重影响性能。JEP 307 的目的就是要采用并行 GC 算法,在发生 Full GC 时可以使用多个线程进行并行回收。JEP 310 对类数据共享进行了扩展,JVM 可以将一些类记录到一个共享的压缩文件里,在 JVM 下一次启动时可以将这个文件映射到 JVM 进程,以此来减少启动时间。该文件也可以在多个 JVM 间共享,在同一个机器上运行多个 JVM 时,这样做可以减少内存占用。该功能在 Java 5 中就已存在,但截止到 Java 9,该功能只允许 bootstrap 类加载器加载压缩的类。JEP 310 的目的是扩展该功能,让应用程序和自定义类加载器也能加载压缩的类。该特性目前仅在 Oracle JDK 中可用,OpenJDK 并不包含该特性。JEP 计划将该特性从 Oracle 私有仓库中迁移到公共仓库,从 Java 10 往后,常规版本将会使用 OpenJDK 的二进制包。此举表明有用户正在使用该特性,所以需要在 OpenJDK 中也支持该特性。JEP 312 旨在改进虚拟机性能,在应用程序线程上调用回调不再需要执行全局虚拟机安全点操作,这意味着 JVM 可以停止单个线程。一些底层小改进包括:降低堆栈跟踪取样所带来的影响。减少信号依赖以获得更好的堆栈取样。通过停止单独线程改进偏向锁。从 JVM 移除了一些内存屏障。从整体来看,Java 10 似乎并没有包含重大新特性或性能改进。这是可以理解的,毕竟这是新发布周期下的第一个版本。

此前我们曾报道过,为了更快地迭代,以及跟进社区反馈,Java 的版本发布周期变更为每六个月一次,并且承诺不会跳票。新的发布周期也会严格遵循时间点,将在每年的 3 月份和 9 月份发布。所以 Java 10 的版本号是 18.3。

JDK 11

JDK 11 将于 2018 年 9 月发布,目前仅有 4 个JEP。按照计划,JDK 11 将会引入动态类文件常量、引入新的垃圾回收器、删除 Java EE 和 CORBA(已在 JDK 9 中废弃)、在 lambda 参数中支持局部类型推断。

309: Dynamic Class-File Constants
318: Epsilon: An Arbitrarily Low-Overhead Garbage Collector
320: Remove the Java EE and CORBA Modules
323: Local-Variable Syntax for Lambda Parameters

推荐阅读

深入理解 Java 枚举类型,这篇文章就够了

【Java技术】盘点 Java 中的队列

MyBatis 类型处理器 TypeHandler

【框架探秘】Spring 专题 01. IoC 容器及其原理

MyBatis 动态 SQL 常用功能

Java 9 新增的 3 个语言新特性

分享学习笔记和技术总结,内容涉及 Java 技术、软件架构、前沿技术、开源框架、数据结构与算法、编程感悟等多个领域,欢迎关注。本文首发于微信公众号“后端开发那点事儿” 。

请注意,本文中所包含的信息在写本文时是准确的。但是到发布时,JDK 10特性组预计将会增加。

Java 10 是采用新发布周期的第一个版本,提供了 109 项新特性,其中最备受关注的莫过于局部变量的类型推断。

新功能

var list =newArrayList();// infers ArrayListvar stream = list.stream();// infers Stream

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

这样的 Java 代码你喜欢吗?

目标发布

相关链接:

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

JDK 10 安装指南

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

JDK 10 发布说明

郑重声明:本文版权归新匍京a奥门-最全网站手机版app官方下载所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。