Java12是一个主要功能版本,它为JAVA带来了许多特定于语言的更改。它遵循Java发布日程推出,并于2019年3月发布,距 Java11发布仅六个月。

Java12是一个非LTS版本。

8个JEP

Java12总共有8个新的JEP(JDK Enhancement Proposals):

  • 189:Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
  • 230:Microbenchmark Suite
  • 325:Switch Expressions (Preview)
  • 334:JVM Constants API
  • 340:One AArch64 Port, Not Two
  • 341:Default CDS Archives
  • 344:Abortable Mixed Collections for G1
  • 346:Promptly Return Unused Committed Memory from G1

官网地址:https://openjdk.org/projects/jdk/12/

特性介绍

Shenandoah GC(垃圾收集器):

Shenandoah是Java12引入的一种新的垃圾收集算法,设计目标是保证低延迟,可以将暂停时间控制在10毫秒以内。

Shenandoah的特点在于,它可以在整个堆上同时进行垃圾收集,无需在单独的年轻代和老年代之间划分内存。此外,Shenandoah的暂停时间与堆大小无关,意味着无论堆的大小如何,它都能提供稳定的暂停时间。

微基准测试套件:

JDK源码中新增了一套微基准测试套件,使开发人员能够轻松运行现有的微基准测试,并创建新的基准测试。这一功能有助于开发人员对代码性能进行更精确的测量和优化。

该套件基于Java微基准套件(JMH),用于测量和优化Java代码的性能。

改进的Switch语句和Switch表达式:

Java12对Switch语句进行了增强,使其支持更多的数据类型,而不再仅限于常量表达式。

引入了Switch表达式(预览版),允许Switch不仅作为语句使用,还可以作为表达式返回一个值。这种新的语法使得在Switch语句中返回一个值变得更加简洁和方便。

int number = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
    default                     -> throw new IllegalStateException("Invalid day: " + day);
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

JVM常量池的新的API

Java12增加了新的API,用于在JVM常量池中进行低级别的操作。这对于一些高级开发和工具开发者来说非常有用。

新的JVM常量API提供了一种模型来描述类文件中的常量池,并提供了对这些常量的访问和操作功能。

One AArch64 Port, Not Two

合并了两个AArch64端口(arm64和aarch64),只保留了一个,从而简化了代码库和维护。

现状:当前Java11及之前版本JDK中存在两个64位ARM端口。这些文件的主要来源位于src/hotspot/cpu/armopen/src/hotspot/cpw/aarch64目录中。尽管两个端口都产生了aarch64实现,我们将前者(由oracle贡献)称为arm64,将后者称为aarch64

新特征:Java12中将删除由0racle提供的arm64端口相关的所有源码,即删除目录open/src/hotspot/cpu/arm中关于64-bit的这套实现,只保留其中有关32-bit ARM端口的实现,余下目录的open/sre/hotspot/cpw/aarch64代码部分就成了 AArch64的默认实现。

目的:这将使开发贡献者将他们的精力集中在单个64位ARM实现上,并消除维护两套实现所需的重复工作。

Default CDS Archives

类数据共享(CDS)功能默认启用,提升了JVM的启动时间和内存占用。CDS通过共享常用类的内存映像来实现这一点。

我们知道在同一个物理机/虚拟机上启动多个M时,如果每个虚拟机都单独装载自己需要的所有类,启动成本和内存占用是比较高的。所以Java团队引入了类数据共享机制(class Data sharing,简称 cDS)的概念,通过把一些核心类在每个JVM间共享,每个M只需要装载自己的应用类即可。

好处是:启动时间减少了,另外核心类是共享的,所以JvM的内存占用也减少了。

Promptly Return Unused Committed Memory from G1

改进了G1垃圾收集器,使其能够更快地返回未使用的已提交内存,从而更高效地管理内存。

Abortable Mixed Collections for G1

G1垃圾收集器引入了可中止的混合收集,以减少垃圾收集暂停时间。