版本帝Java 12 / JDK 12 正式发布,八大重大更新及部分代码示例

禅あ思 2019-03-22 10:50:17 ⋅ 896 阅读

一、简介

去年九月,Oracle推出了一个长期支持的版本Java 11 (18.9 LTS),但是此次发布的Java 12是短期支持版本,可以在下一个版本发布之前获得Oracle的商业支持。自 2 月 7 日开始,Java/JDK 12 就进入了 RC 阶段。按照发布周期,美国当地时间 3 月 19 日Java 12 正式发布面世了!

版本号

java -version
openjdk version "12" 2019-03-19
OpenJDK Runtime Environment (build 12+33)
OpenJDK 64-Bit Server VM (build 12+33, mixed mode)

从version信息可以看出是build 12+33

二、新特性

官网上是这样描述的:


总的来说是八大重大功能更新:

  • 189 Shenandoah: A Low-Pause-Time Garbage Collector - (Experimental) 低暂停时间的GC

  • 230 Microbenchmark Suite 微基准测试套件

  • 325 Switch Expressions (Preview) Switch表达式

  • 334 JVM Constants API JVM常量API

  • 340 One AArch64 Port, Not Two 只保留一个AArch64实现

  • 341 Default CDS Archives 默认类数据共享归档文件

  • 344 Abortable Mixed Collections for G1 可中止的G1 Mixed GC

  • 346 Promptly Return Unused Committed Memory from G1 G1及时返回未使用的已分配内存

三、新特性简解

JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
Shenandoah:低暂停时间的 GC(实验性功能)
新增了一个名为 Shenandoah 的 GC 算法,通过与正在运行的 Java 线程同时进行 evacuation 工作来减少 GC 暂停时间。使用 Shenandoah 的暂停时间与堆大小无关,这意味着无论堆是 200MB 还是 200GB,都将具有相同的暂停时间。

JEP 230: Microbenchmark Suite
微基准测试套件
JDK 源码中新增了一套微基准测试套件,开发人员可通过它轻松运行已有的微基准测试并创建新的基准测试。

JEP 325: Switch Expressions (Preview)
Switch 表达式(预览功能)
对 switch 语句进行了扩展,使其不仅可以作为语句(statement),还可以作为表达式(expression),并且两种写法都可以使用传统的 switch 语法,或者使用简化的 "case L ->" 模式匹配语法作用于不同范围并控制执行流。这些更改将简化日常编码工作,并为 switch 中的模式匹配(JEP 305)做好准备。

  1. 代码示例
    原先版本写法:

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

JEP 334: JVM Constants API
JVM 常量 API
引入 API 来对关键类文件(key class-file)和运行时工件(run-time artifacts)的名义描述(nominal descriptions)进行建模,特别是可从常量池加载的常量。
在新的 java.lang.invoke.constant 包中定义了一系列基于值的符号引用(JVMS 5.1)类型,它们能够描述每种可加载常量。
符号引用以纯 nominal 形式描述可加载常量,与类加载或可访问性上下文区分开。有些类可以作为自己的符号引用(例如 String),而对于可链接常量,定义了一系列符号引用类型(ClassDesc、MethodTypeDesc、MethodHandleDesc 和 DynamicConstantDesc),它们包含描述这些常量的 nominal 信息。

  1. 以String#indent(int)为例
    该方法允许我们调整String实例的缩进。

String result = "foo\nbar\nbar2".indent(4);
System.out.println(result);
// foo
// bar
// bar2
System.out.println(result.length()); // 25
  1. String#transform(Function)

JDK-8203442引入的一个小方法,它提供的函数作为输入提供给特定的String实例,并返回该函数返回的输出。

var result = "foo".transform(input -> input + " bar");
System.out.println(result); // foo bar

或者

var result = "foo"
.transform(input -> input + " bar")
.transform(String::toUpperCase)
System.out.println(result); // FOO BAR

但是,这并不意味着我们应该这样做。

public <R> R transform(Function<? super String, ? extends R> f) {
return f.apply(this);
}

在某种情况下 该方法应该被称为map().

  1. String#describeConstable

一个非常有趣的方法来自新引入的接口java.lang.constant.Constable - 它用于标记constable类型,这意味着这类型的值是常量,可以在JVMS 4.4常量池中定义.

/**
* Returns an {@link Optional} containing the nominal descriptor for this
* instance, which is the instance itself.
*
* @return an {@link Optional} describing the {@linkplain String} instance
* @since 12
*/

@Override
public Optional<String> describeConstable() {
return Optional.of(this);
}
String#resolveConstantDesc(MethodHandles$Lookup)

不会经常手动调用来自java.lang.constant.ConstantDesc。

/**
* Resolves this instance as a {@link ConstantDesc}, the result of which is
* the instance itself.
*
* @param lookup ignored
* @return the {@linkplain String} instance
* @since 12
*/

@Override
public String resolveConstantDesc(MethodHandles.Lookup lookup) {
return this;
}

JEP 340: One AArch64 Port, Not Two
只保留一个 AArch64 实现
在保留 32 位 ARM 实现和 64 位 aarch64 实现的同时,删除与 arm64 实现相关的所有源码。
JDK 中存在两套 64 位 ARM 实现,主要存在于 src/hotspot/cpu/arm 和 open/src/hotspot/cpu/aarch64 目录。两者都实现了 aarch64,现在将只保留后者,删除由 Oracle 提供的 arm64。这将使贡献者将他们的精力集中在单个 64 位 ARM 实现上,并消除维护两套实现所需的重复工作。

JEP 341: Default CDS Archives
默认类数据共享归档文件
针对 64 位平台,使用默认类列表增强 JDK 构建过程,以生成类数据共享(class data-sharing,CDS)归档。

JEP 344: Abortable Mixed Collections for G1
可中止的 G1 混合 GC
如果混合 GC 的 G1 存在超出暂停目标的可能性,则使其可中止。

JEP 346: Promptly Return Unused Committed Memory from G1
G1 及时返回未使用的已分配内存
增强 G1 GC,以便在空闲时自动将 Java 堆内存返回给操作系统。
为了实现向操作系统返回最大内存量的目标,G1 将在应用程序不活动期间定期执行或触发并发周期以确定整体 Java 堆使用情况。这将导致它自动将 Java 堆的未使用部分返回给操作系统。而在用户控制下,可以可选地执行完整的 GC,以使返回的内存量最大化。

四、移除内容

  • 移除com.sun.awt.SecurityWarnin;

  • 移除FileInputStream、FileOutputStream、- Java.util.ZipFile/Inflator/Deflator的finalize方法;

  • 移除GTE CyberTrust Global Root;

  • 移除javac的-source, -target对6及1.6的支持,同时移除--release选项;

五、废弃内容
  • 废弃的API列表见deprecated-list

  • 废弃-XX:+/-MonitorInUseLists选项

  • 废弃Default Keytool的-keyalg值

六、总结

  • java12不是LTS(Long-Term Support)版本(oracle版本才有LTS),oracle对该版本的support周期为6个月。这个版本主要有几个更新点,一个是语法层更新,一个是API层面的更新,另外主要是GC方面的更新。

  • 语法层面引入了preview版本的Switch Expressions;API层面引入了JVM Constants API,引入CompactNumberFormat,让NumberFormat支持COMPACTSTYLE,对String、Files、Collectors、CompletionStage等新增方法;GC方面引入了experimental版本的Shenandoah GC,不过oracle build的openjdk没有enable Shenandoah GC support;另外主要对ZGC及G1 GC进行了改进。

  • 其中JDK12对ZGC支持了Concurrent Class Unloading,默认是开启,使用-XX:-ClassUnloading可以禁用;对于G1 GC则新增支持Abortable Mixed Collections以及Promptly Return Unused Committed Memory特性。

七、精彩评论


---------------END----------------

后续的内容同样精彩

长按关注“IT实战联盟”哦




全部评论: 0

    我有话说:

    Java 14 有了这几个新特性,开发直接飞起来!

    内容介绍: Record -- 简化了简单 Java 类的创建。 Pattern Matching -- 简化了 instanceof 。 Switch 表达式 -- 简化了

    JDK11即将来临,新特性了解一下

    预计 JDK 11 将于 9 月 25 日正式发布,可用于正常使用。

    IntelliJ IDEA 2020.1 稳定版发布,社区版均可使用

    今年发布的首个重大更新版本,新版本增加了对 Java 14 的支持、为部分 Web 和测试框架添加新功能。

    Linux Kernel 5.10.10 正式发布

    Linux 5.10.10 版本正式发布,本次更新包含有 43 个补丁,更新内容主要以修复 bug,提升稳定性为主。 此次更新内容包含: 为 Cadence SPI 控制器添加驱动程序 修复了当

    VirtualBox 6.1.20 发布,支持 Linux 5.11 & 5.12

    近日,VirtualBox 发布了 6.1.20 版本,也是该软件 6.1 版本系列的第十次更新。该版本增加了对 Linux Kernel 5.11 和 5.12 的支持。而且,对于 Linux

    Linux 5.10.9 发布,小幅更新持续优化

    前几天,Linux 5.10.8 发布,最终解决了 Btrfs 的性能问题。仅仅短短几天,5.10.9 也正式推出,相比上个版本,此次更新幅度不,主要聚焦于修复一些bug。 此次更新内容包含

    Java Web实战篇:发布和运维必备的12条Linux命令

    作为一名Java起步的从业人员,学会一些常用的Linux命令是必须的。

    JDK 16 即将发布,新特性速览!

    8 版本之际,这边下一版本 Java 16 有了...

    前端框架 Angular 11.0.0 正式发布,不再支持 IE 9 、10

    前端框架 Angular 11.0.0 正式发布。 Angular 11.0.0 将 TypeScript 升级到 4.0, 对 TypeScript 3.9 不再支持。 放弃了对 IE 9 、10

    「开源资讯」优麒麟 20.10 版本发布--简而美,华而实

    北京时间 2020 年 10 月 23 日,优麒麟团队很高兴地宣布优麒麟(Ubuntu Kylin)开源操作系统 20.10 版本代号Groovy Gorilla)正式发布。20.10 是优麒麟

    CCleaner v5.74.8184 发布重要更新版本、可自动更新

    CCleaner v5.74.8184 现已发布。该版本的一重要改进是面向所有用户扩展了自动更新功能。一旦安装了 5.74 或更高版本,用户将不再需要访问网站来更新

    Go 1.16 发布,支持 macOS ARM64

    Go 1.16 正式发布,该版本主要包括支持 macOS ARM64、工具链优化、运行时和库的实现优化。并且,该版本保留了Go 1兼容性的承诺,几乎所有 Go 程序都能像以前一样继续编译和

    Deepin 深度系统更新(2020.11.25)发布

    深度系统官方发布了深度系统更新(2020.11.25),本次更新部分深度应用,全面优化使用体验,包括磁盘管理器、文件管理器、深度音乐、深度影院、深度相机等。修复部分模块漏洞,提升系统安全性。其他主要

    「收藏版」JDK1.8工作中最常用的14个Stream详细小示例

    一:简介 java.util.Stream 表示能应用在一组元素上一次执行的操作序列。Stream 操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回Stream本身

    GitHub精选:2018年11月份最热门的Java开源项目

    又到了揭晓 11 月份最热门 Java 开源项目排名的时候了,在本月的名单中,出现了几个新面孔,如Java 核心知识库、轻量级容错组件Resilience4j .....

    Android 12 开发者预览版 2.2 发布

    上月底,Google 发布了 Android 12 DP 2.1,解决了 WebView 崩溃的问题。目前,开发者预览版 2.2 已经向运行 Android 12 的 Pixel 手机正式推出

    Java 实战篇-JDK9新特性体验

    JDK9 已经出来好几个月了,我们一起来了解一下JDK9的一些新特性吧

    Apache Tomcat 10.0.4、9.0.44 和 8.5.64 发布

    10 更高版本的用户应注意,作为从 Java...

    Mongoose 5.12.5 发布,MongoDB 异步对象模型工具

    Mongoose 是设计用于异步环境的 MongoDB 对象模型工具。Mongoose 支持 promises 和 callbacks。Mongoose 5.12.5 正式发布,本次更新内容如下