Java 12版本完整指南新功能 | Henn Idan


6个月飞快过去了,是时候仔细看看新的JDK版本了。让我们来看看Java 12及其向开发人员介绍的功能。
自甲骨文推出加速的6个月发布节奏以来已经有一段时间了,并且越来越难以跟上他们添加到桌面的每个版本和功能。
从好的方面来看,这种快速释放率也意味着Java正在为我们引入许多新功能以利用它们。这意味着我们需要时刻关注,以了解正在添加哪些令人兴奋的功能。现在是时候看看Java 12是什么了。

Shenandoah:一个低暂停时间的垃圾收集器
这个实验性功能想要添加一个名为Shenandoah的新垃圾收集(GC)算法,该算法适用于喜欢响应性和可预测的短暂停顿的应用程序。
此功能引入了一种算法,该算法足够高效,允许程序在可用内存中运行,但也经过优化,永远不会中断正在运行的程序超过几毫秒。
Shenandoah算法将通过与正在运行的Java线程同时进行疏散工作来帮助减少GC暂停时间。它交换并发CPU周期和空间以改善暂停时间,并且暂停时间与堆大小无关,这意味着无论堆是200 MB还是200 GB,您都将具有相同的一致暂停时间。
Oracle确实注意到这不是解决所有JVM暂停问题,因为这些问题可能是由于安全时间点(TTSP)问题引起的,甚至是监控应用程序的膨胀。对于这些情况,算法就不太有关了。

切换表达式
这个JEP旨在扩展switch语句; 一个多路分支语句,它提供了一种简单的方法,可以根据表达式的值将执行分配到代码内的不同部分。
这种扩展目前处于预览模式,使我们能够将switch用作语句或表达式,以简化编码并为另一个即将到来的JEP做准备,例如,模式匹配(305)。
为了理解它的含义,Oracle分享了以下示例。下面一段是旧代码,不必要的冗长和视觉上嘈杂的代码经常掩盖难以调试的错误,其中缺少break语句表明发生意外中断:

switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}

新的Switch标签写为“case L ->”,表示只有标签匹配才能执行箭头右侧的代码。所以现在可以编写前面的代码:

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

G1改进
Java 12附带了2个默认垃圾收集器G1的更新。第一个标题为“ G1的Abortable Mixed Collections ”有助于使G1混合收集在可能超过暂停目标时中止。
目前,G1使用分析引擎来选择在收集期间要完成的工作量,并且一旦确定了收集并且已经开始收集,则G1必须收集所有区域中的所有没有停止的活动对象,这导致垃圾收集器超过暂停时间目标,这是JEP旨在解决的问题。
另一个G1功能还专注于提高垃圾收集器的性能,特别是返回未使用的已提交内存。
当前版本的G1仅在完整GC或并发周期内从Java堆返回内存。由于G1努力完全避免完整的GC,并且只触发基于Java堆占用和分配活动的并发周期,因此在许多情况下它不会返回Java堆内存,除非在外部强制执行此操作。
这就是“ 迅速从G1返回未使用的提交内存 ”,专注于通过在G1空闲时自动将Java堆内存返回到操作系统来增强垃圾收集器。

Java 12中引入的其他功能包括:

  • Microbenchmark Suite - 为JDK源代码添加基本的微基准测试套件,使开发人员可以轻松运行现有的微基准测试并创建新的基准测试。
  • JVM常量API - 引入API以模拟关键类文件和运行时工件的名义描述,例如可从常量池加载的常量。此API对于操作Java类和方法的工具非常有用。
  • 默认CDS存档 - 增强JDK构建过程以生成类数据共享(CDS)存档并改进开箱即用的启动时间。

这些值得么?
随着不断的更新,我们看到越来越多的功能引入到该语言中 - 但是开发人员对这一最近的变化有何看法?在大型系统和企业中升级和实现新的语言功能并不总是那么容易,更不用说创建与遗留代码的兼容性以及团队所做的本地技巧和黑客攻击。
事实上,当我们冷酷地看待最近的Java版本时,我们发现频繁发布并不意味着最新版本是最受欢迎的版本。通过查看Google趋势,我们可以看到并非如此。
尽管Java 8是系列中“最古老”的成员,但它的普及程度是不可否认的。Java 11正在获得一些牵引力,可能是因为它是最新的长期支持版本,而Java 12则位于列表的最底层。这是一个新版本,所以我们愿意给它一些时间,但从目前的状态来看,它似乎不会改变太多。
这是否意味着甲骨文应该停止六个月的节奏?好吧,不。这一决定是为了让Oracle能够比以前更快地发布“更小”的功能,从而帮助Java与市场上的其他语言保持一致。
如果你问我们,这个改变只会帮助Java保持其功能和受欢迎程度,无论是对于年轻人和即将到来的开发人员以及编程领域的资深人士。现在我们唯一的问题是...... Java 13将会介绍什么,以及这些功能将如何改变我们的编码方式?