Last Updated:

Java 12 中的新功能

银狐
Java 12 徽标

 

Java 12于 2019 年 3 月 19 日正式发布,请在此处下载 Java 12或此openJDK 存档

Java 12 特性。

Java 12 开发人员功能。

开关表达式(预览)

1. JEP 189:Shenandoah:低暂停时间垃圾收集器(实验性)

Shenandoah 是一个新的低暂停并发垃圾收集器,阅读这篇研究论文,它减少了 GC 暂停时间并且与 Java 堆大小无关(5M 或 5G 的堆大小具有相同的暂停时间,对于大堆应用程序很有用。)

这个 GC 是一个实验性功能,我们需要使用以下选项来启用新的 Shenandoah GC。


-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC

但是,Oracle JDK 和 OpenJDK 都不包含这个新的 Shenandoah GC,另请阅读本文并非所有 OpenJDK 12 版本都包含 Shenandoah:这就是原因


C:\Users\mkyong> java -version
java version "12" 2019-03-19
Java(TM) SE Runtime Environment (build 12+33)
Java HotSpot(TM) 64-Bit Server VM (build 12+33, mixed mode, sharing)

C:\Users\mkyong> java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC
Error occurred during initialization of VM
Option -XX:+UseShenandoahGC not supported

要尝试 Shenandoah GC,我们需要其他 JDK 构建,例如AdoptOpenJDK

PS 这个 Shenandoah GC 成为 Java 15 JEP 379 中的一个产品特性。

进一步阅读

 

2. JEP 230:微基准套件

在 JDK 源代码中添加了一系列 Java Microbenchmark Harness (JMH) 基准测试,对于那些有兴趣添加或修改 JDK 源代码本身的人,现在他们有了一种比较性能的方法。

注意
抱歉,不确定它是如何工作的,如果您知道如何运行 JDK 的基准测试,请在下面发表评论。

进一步阅读

3. JEP 325:切换表达式(预览)

此 JEP 增强了现有的 switch 语句(不返回任何内容)以支持 switch 表达式(返回内容)。

传统的 switch 语句,我们可以通过将值赋给一个变量来返回一个值:


	private static String getText(int number) {
        String result = "";
        switch (number) {
            case 1, 2:
                result = "one or two";
                break;
            case 3:
                result = "three";
                break;
            case 4, 5, 6:
                result = "four or five or six";
                break;
            default:
                result = "unknown";
                break;
        };
        return result;
    }

在 Java 12 中,我们可以使用breakcase L ->从开关返回一个值。


	private static String getText(int number) {
        String result = switch (number) {
            case 1, 2:
                break "one or two";
            case 3:
                break "three";
            case 4, 5, 6:
                break "four or five or six";
            default:
                break "unknown";
        };
        return result;
    }

case L -> 句法。


	private static String getText(int number) {
        return switch (number) {
            case 1, 2 -> "one or two";
            case 3 -> "three";
            case 4, 5, 6 -> "four or five or six";
            default -> "unknown";
        };
    }

注意
这个 switch 表达式在 Java 13 中有第二次预览(放弃了break支持yield),并且这个 switch 表达式成为Java 14 中的标准特性。

进一步阅读

要启用 Java 12 预览功能:


javac --enable-preview --release 12 Example.java
java --enable-preview Example

4. JEP 334:JVM 常量 API

一个新包java.lang.constant,一个新类和接口的列表,用于对关键类文件和运行时工件进行建模,例如,常量池

进一步阅读

5. JEP 340:一个 AArch64 端口,而不是两个

在 Java 12 之前,64 位ARM 架构有两种不同的源代码或端口。

  • 甲骨文—— src/hotspot/cpu/arm
  • 红帽?——src/hotspot/cpu/aarch64

Java 12 移除了 Oraclesrc/hotspot/cpu/arm端口,只保留了一个端口src/hotspot/cpu/aarch64,并使其aarch64成为 64 位 ARM 架构的默认构建。

进一步阅读

6. JEP 341:默认 CDS 档案

所述类数据共享(CDS)通过重新使用现有的档案文件改善了启动时间。

在 Java 12 之前,我们需要使用-Xshare: dump为 JDK 类生成 CDS 存档文件。在 Java 12 中,目录中有一个新classes.jsa文件,/bin/server/即 JDK 类的默认 CDS 存档文件。

 

默认光盘

 

进一步阅读

7. JEP 344:G1 的可中止混合集合

该 JEP 提高了垃圾优先 (G1) 收集器的性能,将有问题的收集集分为两部分 - 强制和可选。如果没有时间处理它,G1 将中止可选部分。

进一步阅读

8. JEP 346:立即从 G1 返回未使用的已提交内存

此 JEP 提高了垃圾优先 (G1) 收集器的性能。如果应用程序处于低活动或空闲状态,G1 会定期触发并发循环以确定总体 Java 堆使用情况并将未使用的 Java 堆内存返回给操作系统。

进一步阅读

下载源代码

$ git clone https://github.com/mkyong/core-java

$ cd java-12

参考