JDK10新特性

JDK10

  • Java10于2018年3月发布,改进的关键点包括一个本地类型推断、一个垃圾回收的增强。
  • Java10计划只是一个短期版本,因此公开更新将在六个月内结束,9月份发布的Java11将是Java的 长期支持(LTS)版本,LTS版本的发布每三年发布一次。

由于oracle版本的jdk早在JDK8u202版本就更改为商用协议,开始收费,因此主要介绍开源版本openjdk

官方文档 JDK 10 (java.net)

【重磅】局部变量类型推断

286: Local-Variable Type Inference

JDK10 可以使用var作为局部变量类型推断标识符,此符号仅限于局部变量,增强for循环的索引,以及传统for循环的本地变量;它不能使用于方法形式参数,构造函数形式参数,方法返回类型,字段,catch形式参数或任何其他类型的变量声明。

标识符var不是关键字;相反,它是一个保留的类型名称。这意味着var用作变量,方法名或则包名称的代码不会受到影响;但var不能作为类或则接口的名字(但这样命名是比较罕见的,因为他违反了通常的命名约定,类和接口首字母应该大写)。

var x = new ArrayList();

合并 JDK 多个代码仓库到一个单独的储存库中

296: Consolidate the JDK Forest into a Single Repository

在 JDK9 中,有 8 个仓库: root、corba、hotspot、jaxp、jaxws、jdk、langtools 和 nashorn 。在 JDK10 中这些将被合并为一个,使得跨相互依赖的变更集的存储库运行 atomic commit (原子提交)成为可能。

java代码仓库相关处置,与开发者无关

垃圾回收器接口

304: Garbage-Collector Interface

这纯粹是重构。

  • HotSpot内部GC代码的更好的模块化
  • 在不扰乱当前代码库的情况下,使向HotSpot添加新的GC变得更简单
  • 使从JDK构建中排除GC变得更容易

这不是让开发者用来控制垃圾回收的接口;而是一个在 JVM 源代码中的允许另外的垃圾回收器快速方便的集成的接口。

【重磅】并行全垃圾回收器G1

307: Parallel Full GC for G1

在JDK 9中,默认垃圾收集器是G1。 前面的默认值是并行收集器(parallel),它有一个并行的全GC。 为了最小化对体验 full GC的用户的影响,G1的 full GC也应该是并行的。 目前JVM提供的正式垃圾回收器有并行、串行、CMS和G1。

应用数据共享(CDS)

310: Application Class-Data Sharing

为了提高启动和内存占用,扩展现有的类数据共享(CDS)特性,允许将应用程序类放置在共享档案中。

  • 通过在不同的Java进程间共享公共类元数据来减少占用空间。
  • 提升启动时间。
  • CDS允许将来自JDK的运行时映像文件($JAVA_HOME/lib/modules)的归档类和应用程序类路径加载到内置平台和系统类加载器中。
  • CDS允许将归档类加载到自定义类加载器中。

线程局部管控

312: Thread-Local Handshakes

在不执行全局VM安全点的情况下对线程执行回调的方法。让它停止单个线程而不是全部线程。

移除Native-Header Generation Tool (javah)

313: Remove the Native-Header Generation Tool (javah)

JDK10 从JDK中移除了javah 工具。该工具已被JDK8 (JDK-7150368)中添加javac高级功能所取代。此功能提供了在编译java源代码时编写本机头文件的功能,从而无需使用单独的工具。

Unicode 标签扩展

314: Additional Unicode Language-Tag Extensions

JDK10 改善 java.util.Locale 类和相关的 API 以实现额外 BCP 47 语言标签的 Unicode 扩展。尤其以下扩展支持:

  • cu:货币类型
  • fw:一周的第一天
  • rg:区域覆盖
  • tz:时区

为支持以上扩展,JDK10对以下API进行更改:

  • java.text.DateFormat::get*Instance:将根据扩展ca、rg或tz返回实例。
  • java.text.DateFormatSymbols::getInstance:将根据扩展rg返回实例。
  • java.text.DecimalFormatSymbols::getInstance:将根据扩展rg返回实例。
  • java.text.NumberFormat::get*Instance:将根据nu或rg返回实例。
  • java.time.format.DateTimeFormatter::localizedBy:将返回DateTimeFormatter 根据ca,rg或rz的实例。
  • java.time.format.DateTimeFormatterBuilder::getLocalizedDateTimePattern:将根据rg返回String。
  • java.time.format.DecimalStyle::of:将返回DecimalStyle根据nu或rg的实例。
  • java.time.temporal.WeekFields::of:将返回WeekFields根据fw或rg的实例。
  • java.util.Calendar::{getFirstDayOfWeek,getMinimalDaysInWeek}:将根据fw或rg返回值。
  • java.util.Currency::getInstance:将返回Currency根据cu或rg返回实例。
  • java.util.Locale::getDisplayName:将返回一个包含这些U扩展名的显示名称的字符串。
  • java.util.spi.LocaleNameProvider:将为这些U扩展的键和类型提供新的SPI。

备用内存设备上分配堆内存

316: Heap Allocation on Alternative Memory Devices

一些操作系统已经通过文件系统公开了非dram内存。例如NTFS DAX模式和ext4 DAX模式。这些文件系统中的内存映射文件绕过页面缓存,并提供虚拟内存到设备上物理内存的直接映射。为了在这样的内存中分配堆,我们可以添加一个新选项,该选项将采用到文件系统的路径,并使用内存映射来实现在内存设备上分配对象堆的预期结果。JEP不打算在多个正在运行的JVM之间共享一个非易失区域,也不打算在进一步调用JVM时重用同一个区域。 -XX:AllocateHeapAt=

现有的堆相关标志,如 , , etc., 和垃圾收集相关标志将继续像以前一样工作。为了确保应用程序的安全,实现必须确保在文件系统中创建的文件是:

  • 受正确权限保护,防止其他用户访问。

  • 在任何可能的场景中,当应用程序终止时删除。

【重磅】基于实验JAVA 的JIT 编译器

317: Experimental Java-Based JIT Compiler

启用Graal作为实验性的JIT编译器使用,从Linux/x64平台开始。Graal是一个基于Java的JIT编译器,它是JDK 9中引入的Ahead-of-Time(AOT)编译器的基础。使它成为实验性JIT编译器是Project Metropolis的一项举措,它是下一步是研究JDK的基于Java的JIT的可行性。

使Graal可用作实验JIT编译器,从Linux / x64平台开始。Graal将使用JDK 9中引入的JVM编译器接口(JVMCI)。Graal已经在JDK中,因此将它作为实验JIT将主要用于测试和调试工作。要启用Graal作为JIT编译器,请在java命令行上使用以下选项:

-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler

Root 证书

319: Root Certificates

在JDK中提供一组默认的root 认证权威(CA)证书。在Oracle的Java SE根CA程序中开源root证书,以使OpenJDK构建对开发人员更有吸引力,并减少这些构建和Oracle JDK构建之间的差异。

cacerts密钥存储库是JDK的一部分,它的目的是包含一组root证书,这些root证书可以用来在各种安全协议中使用的证书链中建立信任。然而,JDK源代码中的cacerts密钥库目前是空的。因此,诸如TLS之类的关键安全组件在OpenJDK构建中不会默认工作。为了解决这个问题,用户必须配置和填充cacerts密钥库,并使用一组root证书来记录,例如, JDK 9 release notes

基于时间的版本控制

322: Time-Based Release Versioning

JEP 223 引入的版本字符串方案比以往有了显著的改进,但是,该方案并不适合未来,现在Java SE平台和JDK的新版本严格按照六个月的节奏发布。JEP 223方案的主要困难在于发行版的版本号对于其前身的重要性和兼容性进行了编码。然而,在基于时间发布模式中,这些品质并不是事先知道的。在发布的开发周期中,它们可能会发生变化,直到最终的功能被集成为止。因此发布的版本号也是未知的。

使用JEP 223的版本号语义,每个在JDK发布版上工作或者在其上构建或使用组件的人都必须先说明发布的发布日期,然后切换到说版本号,已知。维护库,框架和工具的开发人员必须准备好更改在每个JDK发布周期后期检查版本号的代码。这对所有参与者来说都很尴尬和混乱。

因此,这里提出的主要改变是重新编制版本号来编码,而不是编码的兼容性和重要性,而是按照发布周期的时间推移。这是更适合基于时间的发布模型,因为每个发布周期,因此每个发布的版本号,总是提前知道。

后续的版本格式为:[1-9][0-9]((.0).[1-9][0-9])

该格式可以是任意长度,但前四个被赋予特定含义,如:$ FEATURE.$ INTERIM.$ UPDATE.$PATCH

  • $FEATURE:功能发布计数器,不管发布内容如何,都会为每个功能发布增加。功能可能会添加到功能发布中; 如果提前通知提前至少发布一次功能发布,它们也可能会被删除。如果合理,可能会做出不兼容的更改。
  • $INTERIM:临时版本计数器,对于包含兼容错误修复和增强功能的非功能版本递增,但没有不兼容的更改,没有功能移除,也没有对标准API的更改。
  • $UPDATE:更新版本计数器增加了兼容更新版本,可解决新功能中的安全问题,回归和错误。
  • $PATCH:紧急修补程序释放计数器只有在需要生成紧急释放以解决关键问题时才会增加。

版本号永远不会有零元素结尾。如果一个元素及其后的所有元素在逻辑上具有零值,那么它们全部被省略。

在严格六个月的发布模式下,版本号如下所示:

  • $FEATURE 每六个月增加一次。如:2018年3月发布的是JDK 10,2018年9月发布的是JDK 11,等等。
  • $INTERIM 总是为零,因为六个月的模型不包括临时版本。在此为保留其灵活性,以便将来对版本模型的修订可能包括此类版本。
  • $ UPDATE 在$FEATURE发布后的一个月递增,之后每三个月递增一次:如2018年4月发布JDK 10.0.1。7月发布的是JDK 10.0.2等等。

参考博客以及相关资料文档

JDK 10 (java.net)
oracle文档:JDK 10 Release Notes (oracle.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值