一、简介
去年九月,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)做好准备。
代码示例
原先版本写法:
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 信息。
以String#indent(int)为例
该方法允许我们调整String实例的缩进。
String result = "foo\nbar\nbar2".indent(4);
System.out.println(result);
// foo
// bar
// bar2
System.out.println(result.length()); // 25
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().
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实战联盟”哦
注意:本文归作者所有,未经作者允许,不得转载