Open JDK 12 新特性解读

Open JDK 12 新特性解读


安装

《如何在IDEA中切换多版本JDK》

重要JEP

JEP(JDK Enhancement Proposals)是JDK增强体验的简称,是Java社区给出的JDK优化建议。

JEP-JDK12

首先你可以看看《如何在IDEA中切换多版本JDK》,源代码放在了https://github.com/DragonBaby308/JEP11-12

JEP230:微基准测试

微基准测试Microbenchmark作为常规性能测试的一部分,可以基于Java Microbenchmark Harness(JMH)轻松测试JDK性能。

作用:

  1. 已经找到热点函数,需要对热点函数进行定量的优化
  2. 定量知道某个函数需要执行多长时间
  3. 一个函数有多种实现,不知道哪种的性能较好

步骤:

  1. @Benchmark将方法标记为基准测试

  2. @Fork(2)用2个进程进行测试

  3. @Threads(8)每个进程8个线程进行测试

  4. @BenchmarkMode(Mode.Throughput)以吞吐量(单位时间内的操作次数)的形式测试

    其他的还有:
    AverageTime:平均时间
    SampleTime:时间分布
    SingleShotTime:只运行一次
    All:所有模式

  5. @Warmup(iteration = 5)预热,保证测试方法加入JIT热点代码

    JIT(Java即时编译器):对于执行频率非常高的热点代码,JVM会将其编译为机器码。

  6. @Measurement(iteration = 10, time = 5)进行10轮测试,每次5秒

  7. @OutputTimeUnit(TimeUnit.MILLISECONDS):结果输出的时间单位为ms

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//2个进程
@Fork(2)
//每个进程8个线程
@Threads(8)
//吞吐量模式
@BenchmarkMode(Mode.Throughput)
//预热,加入JIT
@Warmup(iterations = 5)
//10轮,每次5s
@Measurement(iterations = 10, time = 5)
//输出时间单位ms
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class JEP23_JMHDemo {

//String基准测试
@Benchmark
public void stringAdd() {
String a = "";
for (int i = 0; i < 10; i++) {
a += i;
}
}

//StringBuilder基准测试
@Benchmark
public void stringBuilderAdd() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++) {
sb.append(i);
}
}

public static void main(String[] args) throws RunnerException {
Options options = new OptionsBuilder()
.include(JEP23_JMHDemo.class.getSimpleName())
// .output("/tmp/benchmark.log")
.build();
new Runner(options).run();
}
}

从结果我们可以看到,StringBuilder.append()的吞吐量是要高于String直接连接的:
JMH测设结果

JEP325:增强的switch语句

扩展switch语句,使其可以作为表达式或者语句。

  1. JDK11及之前的switch语句
1
2
3
4
5
6
7
8
9
10
switch(day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(7);
break;
case TUESDAY:
System.out.println(2);
break;
}
  1. JDK12的switch语句
1
2
3
4
5
6
//不再需要breank;
//可以使用->代替:
switch(day){
case MONDAY,FRIDAY -> System.out.println(0);
case SUNDAY,TUESDAY -> System.out.println(9);
}

JEP341:默认的类数据共享

CDS(Class Data Share):允许通过启动类加载器(Bootstrap ClassLoader)加载的类数据在不同的JVM之间共享
在JDK12之前需要运行-Xshare:dump才能共享,JDK12则默认共享。

JDK13CDS不再局限于启动类加载器,而是应用程序类加载器(Application ClassLoader)和自定义类加载器也可以使用

JEP344:可中止的G1垃圾收集器

由于G1会尽可能选择垃圾较多的region,所以停顿时间可能超过预期时间,这时允许中止部分可选回收以达到设定的停顿时间目标

详见《深入理解JVM》

JEP346:G1归还未使用的内存

可以在空闲时自动将Java堆内存返回给操作系统

详见《深入理解JVM》

ZGC在JDK13中也引入了相同的机制


其他JEP

  1. JEP189:低暂停的垃圾收集器Shenandoah
  2. JEP334:JVM常量API
  3. JEP340:保留Aarch64端口
-------------本文结束感谢您的阅读-------------

本文标题:Open JDK 12 新特性解读

文章作者:DragonBaby308

发布时间:2019年07月24日 - 08:23

最后更新:2019年10月21日 - 18:22

原始链接:http://www.dragonbaby308.com/jdk12/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%