switch表达式
- 新形式的开关标签,类似lamada表达式“ case L ->”形式,表示如果标签匹配,则只执行标签右侧的代码,没有break
- case后的标签支持多个逗号分隔的标签
- 标签右侧代码支持表达式,代码块,直接抛异常
- 更清晰,更安全的switch 表达式,局部变量返回值,语句返回值,个人觉得此处是参考了lamada表达式,可直接返回值然后赋值给接收的变量
- break语句返回值,不过此处需注意,如果需要break语句返回值,则需每一个case后都有返回值或者抛出一个异常
示例如下:
// java12以前 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; } // java12 ’case L ->‘形式 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); } // java12以前 int numLetters; switch (day) { case MONDAY: case FRIDAY: case SUNDAY: numLetters = 6; break; case TUESDAY: numLetters = 7; break; case THURSDAY: case SATURDAY: numLetters = 8; break; case WEDNESDAY: numLetters = 9; break; default: throw new IllegalStateException("Wat: " + day); } // java12 更清晰,更安全的switch表达式 int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; }; // java12 break可携带返回值 int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY: break 6; case TUESDAY: break 7; case THURSDAY, SATURDAY: break 8; case WEDNESDAY: break 9; default: System.out.println("default statement..."); break 0; }; // java12 break value error int i = switch (day) { case MONDAY -> { System.out.println("Monday"); // ERROR! Block doesn't contain a break with value } default -> 1; }; i = switch (day) { case MONDAY, TUESDAY, WEDNESDAY: break 0; default: System.out.println("Second half of the week"); // ERROR! Group doesn't contain a break with value };
默认CDS归档
在64位平台上使用默认类列表增强JDK构建过程以生成类数据共享(CDS)归档。
- 改善开箱即用的启动时间
- 消除用户运行-Xshare:dump以从CDS中受益的需要
- 仅为64位版本生成默认存档,后续可能会添加对32位版本的支持。
Shenandoah低暂停时间垃圾收集器
- 添加一个名为Shenandoah的新垃圾收集(GC)算法,通过与正在运行的Java线程同时进行疏散工作来减少GC暂停时间。使用Shenandoah的暂停时间与堆大小无关,这意味着无论堆是200 MB还是200 GB,您都将具有相同的一致暂停时间。
- 作为一个实验性的功能,要启用/使用Shenandoah GC,需要以下JVM选项:-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC。
JMH 基准测试
在JDK源代码中添加一套基本的微基准测试,使开发人员可以轻松运行现有的微基准测试并创建新的基准测试。
- 基于[Java Microbenchmark线束(JMH)] [1]
- 稳定且经过调整的基准测试,针对持续性能测试
- 在功能发布的功能完成里程碑之后,以及非功能版本之后的稳定且不移动的套件
- 支持与先前JDK版本的适用测试比较
- 简单
- 轻松添加新基准
- 在API和选项更改,不推荐使用或在开发期间删除时,可以轻松更新测试
- 易于构建
- 易于查找和运行基准
- 支持JMH更新
- 在套件中包含大约一百个基准的初始集
JVM常量API
引入API来模拟关键类文件和运行时工件的名义描述,特别是可从常量池加载的常量。
- 在新包中定义了一系列基于值的符号引用(JVMS 5.1)类型java.lang.invoke.constant,能够描述每种可加载常量。符号引用描述了纯粹名义形式的可加载常量,与类加载或可访问性上下文分开。有些类可以作为自己的符号引用(例如String);
- 用于可交联的常数,定义一个家庭符号引用类型(的ClassDesc,MethodTypeDesc,MethodHandleDesc,和DynamicConstantDesc包含标称信息来描述这些常量)。
一个AArch64端口
- 在保留32位ARM端口和64位aarch64端口的同时,删除多余的arm64端口实现代码
- 删除此端口将允许所有贡献者将他们的精力集中在单个64位ARM实现上,并消除维护两个端口所需的重复工作。
可中断的G1
如果G1混合集合可能超过暂停目标,则使其可以中止。
如果G1发现启发式的收集重复的选择错误的区域数,及收集预测不准确的时候,会切换到更复杂的方式来执行收集:将需收集的内容拆分为两个部分,强制部分和可选部分。强制性部分包括G1不能逐步收集处理的部分(例如年轻代),但也可以包含老年代以提高效率。例如,强制部分可以是预测的收集部分的80%。剩余的20%(仅由老年代组成)构成可选部分。
G1完成强制部分的收集后,如果还有剩余时间,G1会以更细粒度的级别开始收集可选部分。此可选部分的收集粒度取决于剩余的时间量,一次最多只能到一个区域。完成对可选部分的收集后,G1可以根据剩余时间决定停止集合。
随着收集预测再次变得准确,可选部分变得越来越小,直到强制部分再次包含所有待收集部分(即,G1完全依赖于其启发式)。如果预测再次变得不准确,则下一个集合将再次包含强制和可选部分。
通过G1更及时的返回未使用的内存
增强G1垃圾收集器,以便在空闲时自动将Java堆内存返回给操作系统
为了实现向操作系统返回最大内存量的目标,G1将在应用程序不活动期间定期尝试或触发并发周期以确定整体Java堆使用情况。这将导致它自动将Java堆的未使用部分返回给操作系统。同时,用户可主动选择full gc ,从而最大化的返回的未使用内存。
参考文档:JDK 12 Release Notes
来源;https://blog.csdn.net/gxs1688/article/details/88693003
本文暂时没有评论,来添加一个吧(●'◡'●)