JDK 12主要特性一览

JDK12 在2019/03/19终于与大家见面了,不同于JDK11,JDK12并不是一个LTS版本。作为一个中间版本,JDK12版本特性增加较少。
2017年宣布的加速发布节奏要求每六个月发布一次功能,每季度更新一次,每三年发布一次长期支持(LTS)更新版本(或每六个版本一次)。下一个LTS版本将是Java 17,计划于2021年9月发布。尽管 Java 11 才发布不久,但距离 Java 12 的发布也就剩下不到四个月的时间。
因此JDK12 并不适合作为生产环境升级版本,但JDK12带来的一些令人激动的新特性,同样值得我们关注。

特性列表

189: Shenandoah: 短暂停垃圾回收器 (实验)
230: Microbenchmark Suite: Microbenchmark组件
325: Switch Expressions (Preview) : 选择表达式(预览)
334: JVM Constants API: JVM常量API
340: One AArch64 Port, Not Two:只保留一个 AArch64 实现
341: Default CDS Archives:默认CDS档案
344: Abortable Mixed Collections for G1:G1 混杂集合区可抛弃
346: Promptly Return Unused Committed Memory from G1:G1快速返回未使用的承诺内存

Shenandoah: 短暂停垃圾回收算法

Shenandoah是jdk12一个新的垃圾回收算法。通过与运行的Java线程并行工作来减少GC暂停时间。使用Shenandoah的暂停时间与堆大小无关,这意味着无论堆是200 MB还是200 GB,都将具有相同暂停时间。
Shenandoah适用于高吞吐和大内存场景,不适合高实时性场景。Shenandoah算法设计目标主要是响应性和一致可控的短暂停顿,对于垃圾回收生命周期中安全点停顿(TTSP)和内存增长监控的时间开销并无帮助。
现代计算机相较过去拥有了更大的内存和更多的处理器,根据服务水平协议(Service Level Agreement, SLA),应用的响应时间应该保证在50ms到500ms。为了实现实现目标下限,理想情况是通过并行回收算法,不停顿或停顿时间在ms内进行回收。
Shenandoah算法为每个Java对象添加了一个间接指针,使得GC线程能够在Java线程运行时压缩堆。标记和压缩是同时执行的,因此我们只需要暂停Java线程在一致可控的时间内扫描线程堆栈以查找和更新对象图的根。

更多
Shenandoah: An open-source concurrent compacting garbage collector for OpenJDK
OpenJDK Shenandoah

Switch Expressions

正如在《JDK 11主要特性一览》中的预测一样,java在向scala不断学习中。
按在JEP 325中的说法,break的流程控制是一种低级的做法,括弧这里点名道姓的说了c/c++, (:/斜眼笑)

switch (day) {
    case MONDAY:
    case TUESDAY:
        int temp = ...
        break;
    case WEDNESDAY:
    case THURSDAY:
        int temp2 = ...     // Why can't I call this temp?
        break;
    default:
        int temp3 = ...     // Why can't I call this temp?
}

那么如何使用一种比较高级的做法呢?熟悉scala的小伙伴一定不会陌生,通过->实现域界定,对于并且 -> 右边表达式是是一个独立的域,域中的变量为局部变量,因此不存在上文出现的temp2、temp3这样的问题。这里可以通过,可以匹配多个标签。

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);
}

赋值方面,switch表达式使用break控制时通过临时变量来赋值

int numLetters;
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        numLetters = 6;
        break;
    case TUESDAY:
        numLetters = 7;
        break;
    case THURSDAY:
    case SATURDAY:
        numLetters = 8;
        break;
    case WEDNESDAY:
        numLetters = 9;
        break;
    default:
        throw new IllegalStateException("Wat: " + day);
}

而新switch语句中使用了更贴近函数式的方案,直接将->右域内最后一行作为赋值语句。

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};

不足之处在于java中目前还未提供类似于scala case class的类型系统,pattern match在java中的使用还仅限于基本类型、String、枚举类型。相信在未来java应该会引入scala 中case class类似关键字,此时pattern match的优势会被进一步发挥。

你可能感兴趣的:(java)