一帆磨砺

生活所迫,一叶孤舟

0%

Java版本特性-JDK12

引用参考文档链接

  1. jdk12特性列表
  2. Shenandoah算法论文
  3. jmh Git仓库

写在开头

  1. JDK12对用户代码无直接影响
  2. 主要内容是新增GC(实验阶段)和对已有G1的增强

新GC:Shenandoah(实验)

GC时间不受堆内存大小影响,200M与200G 停顿时间一致,通过启动参数-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC开启。

基准测试组件

添加了基础的基准测试组件,方便开发人员(测试方向)执行现有的基准测试和创建新的基准测试。
实际尝试了,从JDK12-18在maven未引入jmh相关jar包是无法使用相关注解的。

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.19</version>
</dependency>

但是官方文档明确说了将基础的组件添加到了jdk的源码中,因此只能推测是只开放给JDK开发人员使用。通过官方github下载的jdk12源码,目录结构也与文档一致,相关代码都在test目录中,因此该特性是针对JDK开发人员来说的….

Switch表达式优化(JDK12暂未开放)

简化case分支

但在JDK12中还不能使用,会提示Enhanced 'switch' blocks are not supported at language level '12'

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
}
1
2
3
4
5
6
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代码块可当作函数返回值

实际不确定这样写会不会影响代码的可读性,尤其是switch的case情况较多的场景,还是建议封装为单独的函数,避免switch代码块庞大影响代码可读性。

模板

1
2
3
4
5
T result = switch (arg) {
case L1 -> e1;
case L2 -> e2;
default -> e3;
};

示例

1
2
3
4
5
6
7
8
9
int result = switch (s) {
case "Foo":
break 1;
case "Bar":
break 2;
default:
System.out.println("Neither Foo nor Bar, hmmm...");
break 0;
};

JVM常量API

Introduce an API to model nominal descriptions of key class-file and run-time artifacts, in particular constants that are loadable from the constant pool.

引入一个 API 来模拟关键类文件和运行时工件的名义描述,特别是可从常量池加载的常量。
没有搜到有博主分享使用该特性的场景,应该也是JDK或JVM内部的开发工作优化。

AArch64兼容代码优化

属于代码重构,简化后续JDK工作。

默认 CDS

该特性仅针对64位的JDK,相当于默认开启JDK的CDS,如果不需要CDS,需要使用启动参数-Xshare:off停止。

可中断的Mixed G1

当G1预计回收的区域过多时,将会切换到Mixed模式,将目标切割为必须回收与可选回收,在目标时间内,有限回收必须回收部分,如果时间有剩余,才会处理可选回收部分,并且时间结束就立即停止,无论可选回收部分是否全部回收结束。
有效的避免G1的回收时间超过用户指定时间(-XX:MaxGCPauseMillis默认200ms)

空闲时G1也可释放内存回操作系统

增强G1(定期触发),使得G1在应用程序不活动期间,也可以进行内存回收行动,减少资源消耗。
触发条件有两个,需同时满足:

  1. G1PeriodicGCInterval时间内无任何垃圾回收行为(包括并发标记周期)
  2. 一分钟内,系统负载(通过getloadavg()获取)低于G1PeriodicGCSystemLoadThreshold(该值为0则此条件忽略)

欢迎关注我的其它发布渠道