switch表达式
传统switch语句弊端:
- 匹配自上而下执行,忘记写break,后面的case无论是否匹配都会执行
- 所有的case公用一个块范围,不同case语句中的变量不能重名
- 不能在一个case中写多个执行结果一致的条件(
case A, B, C: xxx;) - 整个switch不能作为表达式的返回值
Fruit fruit = Fruit.APPLE;
int num = switch(fruit) {
case PEAR -> {
System.out.println(1);
return 1;
}
case APPLE, ORANGE -> 2;
default -> throw new IllegalStateException("error");
}
微基准测试套件
它基于JMH(Java Microbenchmark Harness),为JDK源码添加了一套基准测试,简化了现有的微基准测试的运行和新基准测试的创建,其目标在于提供一个稳定且便捷的基准。
微基准套件与JDK在同一目录中,并且在构建后生成单个jar文件。用户需要运行命令:make build-microbenchmark 开启构建套件
默认生成类数据共享归档文件
在同一个虚拟机上启动多个JVM时,如果每个虚拟机都单独装载自己需要的所有类,启动成本和内存占用成本很高。所以java团队引入了类数据共享机制(CDS),将一些核心类在每个JVM中共享,使启动时间减少,JVM内存占用减少。
JDK12之前想用CDS,必须使用java -Xshare:dump作为额外步骤来运行,JDK12之后默认生成CDS,文件保存在${JAVA_HOME}/lib/server目录下,文件名叫classes.jsa
可中断的G1混合GC
当G1垃圾回收器的回收超过暂停时间的目标,能中止垃圾回收过程,目的是使用户能够设置预期的JVM停顿时间。
G1将GC回收集分为了mandatory(紧急)和optional(可选)两部分,若处理完mandatory后的时间小于设置的预期时间则会继续处理optional。
mandatory包括G1不能递增处理的GC回收集,如新生代;optional部分处理粒度取决于剩余时间。
增强G1
G1能够在空闲时间将java堆内存返还给操作系统。
在JDK12以前,G1只有在full GC和并发处理周期的时候才会返还内存,而这两种情况都是G1极力避免的情况,因为这会导致性能的损失。所以在大多数的情况下,除非有外部强制执行,不然不会及时归还内存。
具体实现是G1在应用程序不活动期间定期生成或循环整体java堆的使用情况,以便G1能及时发现java中不使用的堆。