JDK 12:Java 12 中的新特性

Posted 搞技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK 12:Java 12 中的新特性相关的知识,希望对你有一定的参考价值。



基于 Java SE(标准版)12 的 Java Development Kit 12 的生产版本现已推出。Oracle 提供了适用于 Linux、Windows 和 MacOS 的 JDK 12 版本。 

Java 12 中的新特性

雪兰多垃圾收集器

Java 12 添加了 Shenandoah,一种实验性垃圾收集算法,通过在 Java 线程运行的同时执行疏散工作来减少垃圾收集暂停时间。Shenandoah 为重视响应性和可预测的短暂停顿的应用程序提供了适当的算法。然而,目的不是解决所有 JVM 暂停问题。

Red Hat 目前在 Aarch64 和 AMD64 架构上支持 Shenandoah。

G1 垃圾收集器的可中止混合收集

如果 G1 混合集合可能超过暂停目标,则 Java 12 使它们可以中止。G1 的目标是满足用户为其收集暂停提供的暂停时间目标。

以前,高级分析引擎会选择收集期间要完成的工作量。结果是一组称为集合集的区域。一旦确定了集合并开始收集,G1 就不停地收集所有区域中集合区域中的所有活动对象。但是,如果应用程序的启发式选择一个太大的集合集,这可能导致 G1 超过暂停时间目标。



需要一种机制来检测启发式何时重复选择不正确的收集工作量,如果发生这种情况,让 G1 逐步执行收集工作,其中收集可以在每一步后中止。Java 12 中引入的机制使 G1 能够更频繁地满足暂停时间目标。

提示返回未使用的已提交内存

Java 12 增强了 G1 以在空闲时自动将 Java 堆内存返回给操作系统。当应用程序活动非常低时,会在合理的时间段内释放此内存。

以前,G1 仅在完全垃圾收集或并发循环期间从堆中返回内存。由于 G1 试图避免完全垃圾回收,仅根据堆占用和分配活动触发并发循环,因此在许多情况下它不会返回堆内存,除非在外部被迫这样做。这种行为在资源按使用付费的容器环境中是不利的。即使 JVM 由于不活动而只使用其分配内存的一小部分,G1 也保留了完整的堆。因此,客户一直为所有资源付费,而云提供商无法充分利用他们的硬件。

使用 Java 12,JVM 可以检测堆未充分利用的阶段,并在此期间自动减少其堆使用。 

JVM 常量 API

此 API 对键类文件和运行时工件的名义描述建模,尤其是可从常量池加载的常量。Java 12 在一个新包中定义了一系列基于值的符号引用类型java.lang.invoke.constant,用于描述每种类型的可加载常量。

常量池存在于每个 Java 类中,用于在类中存储操作数和字节码指令。常量池中的条目描述运行时工件(如类和方法)或简单值(如字符串和整数)。这些条目称为可加载常量。

操作类文件的程序必须对字节码指令和可加载常量进行建模。但是使用标准 Java 类型来模拟可加载常量是不够的。这对于描述字符串的可加载常量来说可能是可以接受的,但对于描述类的可加载常量来说这是有问题的,因为生成“活动”Class对象依赖于类加载的正确性和一致性。然而,类加载具有许多环境依赖性和故障模式。

因此,如果处理可加载常量的程序能够以名义的、符号的形式操作类和方法以及鲜为人知的工件,例如方法句柄和动态计算的常量,那么它们就可以得到简化。因此,JVM 常量 API 为库和工具提供了一种描述可加载常量的单一标准方式。

改进的启动、CDS 和垃圾收集

Java 12 增强了 JDK 构建过程,以在 64 位平台上使用默认类列表生成默认类数据共享 (CDS) 存档。这缩短了开箱即用的启动时间,并且无需运行-Xshare:dump即可从 CDS 中受益。JDK 构建过程已修改为java-xshare:dump在链接映像后运行。

已包含其他命令行选项以微调垃圾收集堆时间,以改进常见情况下的内存布局。具有更高级要求的用户,例如包含应用程序类和不同垃圾收集配置的自定义类列表,仍然能够创建自定义 CDS 存档。

减少 ARM 端口的数量

Java 12 删除了与arm64端口相关的所有源代码,同时保留了 32 位 ARM 和 64 位aarch64. 删除此端口将使贡献者将精力集中在单个 64 位 ARM 实现上,并消除因维护两个端口而导致的重复工作。目前,JDK 中有两个 64 位 ARM 端口。

切换表达式

Switch 表达式通过扩展switch语句来简化编码,因此它可以用作语句或表达式。这使得语句和表达式都可以使用“传统”或“简化”的范围和控制流行为。这些变化导致简单的“日常”编码和使用的铺路模式匹配switch

随着 Java 构建器开始支持模式匹配,Javaswitch语句的不规则性 已成为障碍。这些包括开关块的默认控制流行为;switch 块的默认范围,其中块被视为一个单一范围;和 switch 仅作为声明工作。Javaswitch语句的当前设计紧跟 C++ 等语言,并且默认情况下支持 fallthrough 语义。此控制流对于编写低级代码很有用。但是当 switch 用于更高级别的上下文时,其容易出错的性质开始超过灵活性。

基本基准套件

JDK 12 包含一套基本的微基准测试,已添加到平台的源代码中。目标是让开发人员更容易运行现有的基准测试或构建新的基准测试。

微基准测试套件提案于 2014 年 7 月创建并于 2018 年 11 月上旬更新,以Java 微基准测试工具(JMH)为基础,用于构建用 Java 和其他 JVM 语言编写的基准测试。该套件与 JDK 源代码位于同一目录中,开发人员可以轻松添加新的基准测试。

为新的 JDK 特性提供基准或创建一套涵盖 JDK 中所有内容的完整基准并不是一个目标。另请注意,常规 JDK 构建不需要基准测试套件,而是一个单独的构建目标。 

该提案要求在wiki.openjdk.java.net上创建一个新页面,以解释如何开发基准和描述需求。这些要求将要求遵守编码标准、可再现的性能和文档。

JDK 12 更新

计划要求 JDK 12在六个月内被JDK 13取代之前接收两次更新。JDK 12 是 Oracle于 2017 年 9 月随JDK 9推出的六个月发布节奏的一部分。JDK 12 的特点是功能版本,与JDK 11不同,JDK 11是一个长期支持版本,计划提供几年的支持。


以上是关于JDK 12:Java 12 中的新特性的主要内容,如果未能解决你的问题,请参考以下文章

MySQL高可用之主备同步:展望未来,JDK-12的新特性

JDK12的新特性:teeing collectors

JDK12的新特性:teeing collectors

JDK12的新特性:CompactNumberFormat

JDK12的新特性:CompactNumberFormat

Java12的新特性