介绍
这是将成为Java 12的活跃帖子,正如预期的那样,这篇文章将随着时间的推移而扩展和变化,直到Java 12的开发可能在2018年底被冻结。我计划更新这篇文章时新功能(JEP)针对JDK 12,或者对已经针对的JEP进行重要更新。
Java 12于2019/03/20发布。
如果某些内容是预览功能,完全则会指定并实施,但在发布中提供以收集反馈,因此它不是永久性更改。
变化
2019/03/20:Java 12发布.https://jdk.java.net/12/
2019/01/29:RDP 2。
2018/12/17:RDP 1.从此版本中删除JEP 326.Early-Access Build 24(2018/12/15)。
2018/11/28:Early-Access Build 21(2018/11/22)。对帖子进行了小的更改,使用新版本重新运行示例.JEP 334。
2018/11/14:JEP 230补充道。
2018/10/08:JDK 12 Timeline补充道.JEP 340和JEP 341补充说.Early-Access Build 14(2018/10/4)。
2018/09/27:这篇文章第一次发表。包括JEP 325和326。Early-Access Build 12(2018/9/20)。
Java 12功能
该列表来自OpenJDK JDK 12项目页面和JDK 12的JEP仪表板。
JEP 189:Shenandoah:低暂停时间垃圾收集器(实验性)
红帽为aarch64和AMD64实现并支持,本文中描述的雪兰垃圾收集器提供可预测和短暂的GC暂停,与堆大小无关。
它将作为实验特征提供,因此为了使用它,-XX:+ UnlockExperimentalVMOptions需要与之一起使用-XX:+ UseShenandoahGC。
此外,默认(甲骨文)的OpenJDK的版本不包含此功能。您可以使用其他构建或自己构建。
在甲骨文的OpenJDK的早期发布版本中:
$ java -XX:+ UnlockExperimentalVMOptions -XX:+ UseShenandoahGC VM
Option -XX 初始化期间发生错误:+不支持UseShenandoahGC
在我的自定义构建中,这些标志没有错误。
JEP 230:Microbenchmark Suite
基于Java Microbenchmark Harness(JMH)的方法和一套微基准测试,可以轻松测试JDK的性能,将添加到JDK源代码中。
它使用如下,但这些步骤要求您拥有一个能够从源代码构建JDK的系统。
$ cd jdk-src
$ sh make / devkit / createJMHBundle.sh
$ ./configure–with-jmh = build / jmh / jars --enable-headless-only
$ make test TEST =“micro:java.lang.reflect” …经过多行输出…
测试选择’micro:java.lang.reflect’,将运行:
micro:java.lang.reflect
运行测试’micro:java.lang.reflect’
#JMH版本:1.21
#VM版本:JDK 12内部,OpenJDK 64位服务器VM,12内部+ 0-adhoc.ubuntu.jdk-src
#VM调用者:/ home / ubuntu / jdk -src / build / linux-x86_64-server- release /
images / jdk / bin / java #VM选项: - add-opens = java.base / java.io =
ALL-UNNAMED
#预热:5次迭代,每次10秒 #测量:5次迭代,每次10次 #超时:每次迭代10分钟
#Threads:1个线程,将同步迭代
#Benchmark模式:平均时间,时间/操作
#Tenmark:org.openjdk.bench.java.lang.reflect.Clazz.getConstructor #运行进度:0.00%完成,ETA 01:31: 40
#Fork:1 of 5
#Warmup Iteration 1:19.849 ns / op
#Warmup Iteration 2:19.067 ns / op
#Warmup Iteration3:20.044 ns / op
#Warmup Iteration 4:20.050 ns / op
#Warmup Iteration 5:20.061 ns / op Iteration 1:20.037 ns / op Iteration
2:20.019 ns / op Iteration 3:20.070 ns / op Iteration 4:20.052 ns /
op Iteration 5:20.024 ns / op …
并继续运行更多测试
JEP 325:切换表达式
这是预览功能。
切换使用此JEP在的Java中有两个主要更改:
引入案例L - >了不需要break语句的语法,因为只执行了 - >旁边的语句。
switch可以是一个表达式,因此它可以有一个值,或者它可以返回一个值。
例:
public class JEP325 {
public static void main(String [] args){
// args [0]是星期几,从1-sunday
final int day = Integer.valueOf(args [0]);
//传统的交换机
开关(日){
案例2:
案例3:
案例4:
案例5:
案例6:
System.out.println(“工作日”);
打破;
案例7:
案例1:
System.out.println(“周末”);
打破;
default:
System.out.println(“invalid”);
}
// L - >语法
//无需中断,只有代码 - >运行
开关(日){
案例2,3,4,5,6 - > System.out.println(“工作日”);
case 7,1 - > System.out.println(“weekend”);
default - > System.out.println(“invalid”);
}
//切换表达式
//然后如果用作表达式,则switch应该是穷举的
// break <value_of_switch_expression>块的语法
final String attr = switch(day){
case 2,3,4,5,6 - >“weekday”;
案例7,1 - >“周末”;
//可以在没有块的
情况下执行此操作并中断//所以默认 - >“无效”; 实际上这里
默认是 - > {
break“invalid”;
}
};
的System.out.println(ATTR);
}
}
根据arg [0],它输出相同的字符串(工作日,周末或无效)三次。
JEP 326:原始字符串文字(从JDK 12版本中删除)
它已从JDK 12版本中删除。
这是预览功能。
Raw String Literals可以轻松使用包含特殊字符和多行字符串的字符串。这个JEP还引入了一些String :: align函数,可以很容易地使用多行缩进文本,并使用unescape / escape函数来转换(传统)字符串文字。
例:
public class JEP326 {
public static void main(String args []){
// traditional string
final String s1 =“test”;
//传统的多行字符串
final String s2 =“line1
line2“;
// raw string literals
final String rs1 =`test`;
final String rs2 =`
line1
line2
line3`;
final String rs3 =`` backtick`inside`` ;
final String rs4 =`
`;
的System.out.println(RS1);
的System.out.println(RS2);
的System.out.println(rs2.align());
的System.out.println(RS3);
//字符串:: unescape()尚未在jdk12 + 21
System.out.println(rs4.length())上实现;
// System.out.println(rs4.unescape()。length());
}
}
这输出:
test
line1
line2
line3
line1
line2
line3
backtick`inside
2
JEP 334:JVM常量API
JEP 334提出了一个API建模关键类文件和运行时工件,如常量池。这样的API将包含类似ConstantDesc,ClassDesc的类,此API的草案可在此处获得:https://cr.openjdk。 java.net/~vromero/constant.api/javadoc.04/java/lang/invoke/constant /package-summary.html。
这对于操作类和方法的工具很有用。
JEP 340:一个AArch64端口,而不是两个
有两组不同的源,即端口,在JDK中针对ARM 64位。一个由Oracle提供,arm64(hotspot / cpu / arm),另一个是aarch64(hotspot / cpu / aarch64)。此JEP删除arm64,因此将删除与#ifdefsunder hotspot / cpu / arm一起使用的所有源代码,并且64位ARM构建将默认为aarch64.hotspot / cpu / arm仍将提供32位ARM端口。
$ cd jdk-src / src / hotspot / cpu / arm
$ hg update jdk-12 + 1
$ grep -r AARCH64 * | wc -l
1694
$ hg update jdk-12 + 21
$ grep -r AARCH64 * | wc -l
0
JEP 341:默认CDS档案
类数据共享(CDS)是一种减少启动时间和从内存共享中受益的功能。但是,如果未使用安装程序安装JRE,则默认情况下不会生成CDS存档java -Xshare:dump,必须手动运行。
这可以在JDK 11中观察到。如果从http://jdk.java.net/11/安装JDK 11 GA Release,则lib / server文件夹不包含CDS存档classes.jsa文件。如果你运行java -Xshare :转储,它将被生成。
使用此JEP,默认情况下将生成CDS存档。
JEP 344:G1的可流动混合收集
为了满足用户提供的暂停时间目标,此JEP使G1垃圾收集器中止垃圾收集过程,方法是将要设置的垃圾收集区域(混合收集集)拆分为强制和可选部分,并中止垃圾收集如果没有达到暂停时间目标,则为可选部分。
JEP 346:迅速从G1返回未使用的提交内存
此JEP使G1垃圾收集器在一段低应用程序活动后将垃圾收集的内存区域返回给操作系统。目前G1只是在完全GC(或并发周期)之后将内存返回到操作系统,因此实际上它可能根本没有将垃圾收集的内存返回给操作系统。
获取更多Java高级架构最新视频,
直接点击链接加群。https://jq.qq.com/?_wv=1027&k=5lXBNZ7