Java12的八大新特性

Java12的八大新特性

switch表达式

  1. 新形式的开关标签,类似lamada表达式“ case L ->”形式,表示如果标签匹配,则只执行标签右侧的代码,没有break
  2. case后的标签支持多个逗号分隔的标签
  3. 标签右侧代码支持表达式,代码块,直接抛异常
  4. 更清晰,更安全的switch 表达式,局部变量返回值,语句返回值,个人觉得此处是参考了lamada表达式,可直接返回值然后赋值给接收的变量
  5. 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)归档。

  1. 改善开箱即用的启动时间
  2. 消除用户运行-Xshare:dump以从CDS中受益的需要
  3. 仅为64位版本生成默认存档,后续可能会添加对32位版本的支持。

Shenandoah低暂停时间垃圾收集器

  1. 添加一个名为Shenandoah的新垃圾收集(GC)算法,通过与正在运行的Java线程同时进行疏散工作来减少GC暂停时间。使用Shenandoah的暂停时间与堆大小无关,这意味着无论堆是200 MB还是200 GB,您都将具有相同的一致暂停时间。
  2. 作为一个实验性的功能,要启用/使用Shenandoah GC,需要以下JVM选项:-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC

JMH 基准测试

在JDK源代码中添加一套基本的微基准测试,使开发人员可以轻松运行现有的微基准测试并创建新的基准测试。

  1. 基于[Java Microbenchmark线束(JMH)] [1]
  2. 稳定且经过调整的基准测试,针对持续性能测试
    • 在功能发布的功能完成里程碑之后,以及非功能版本之后的稳定且不移动的套件
    • 支持与先前JDK版本的适用测试比较
  3. 简单
    • 轻松添加新基准
    • 在API和选项更改,不推荐使用或在开发期间删除时,可以轻松更新测试
    • 易于构建
    • 易于查找和运行基准
  4. 支持JMH更新
  5. 在套件中包含大约一百个基准的初始集

JVM常量API

引入API来模拟关键类文件和运行时工件的名义描述,特别是可从常量池加载的常量。

  1. 在新包中定义了一系列基于值的符号引用(JVMS 5.1)类型java.lang.invoke.constant,能够描述每种可加载常量。符号引用描述了纯粹名义形式的可加载常量,与类加载或可访问性上下文分开。有些类可以作为自己的符号引用(例如String);
  2. 用于可交联的常数,定义一个家庭符号引用类型(的ClassDescMethodTypeDescMethodHandleDesc,和DynamicConstantDesc包含标称信息来描述这些常量)。

一个AArch64端口

  1. 在保留32位ARM端口和64位aarch64端口的同时,删除多余的arm64端口实现代码
  2. 删除此端口将允许所有贡献者将他们的精力集中在单个64位ARM实现上,并消除维护两个端口所需的重复工作。

可中断的G1

如果G1混合集合可能超过暂停目标,则使其可以中止。

如果G1发现启发式的收集重复的选择错误的区域数,及收集预测不准确的时候,会切换到更复杂的方式来执行收集:将需收集的内容拆分为两个部分,强制部分和可选部分。强制性部分包括G1不能逐步收集处理的部分(例如年轻代),但也可以包含老年代以提高效率。例如,强制部分可以是预测的收集部分的80%。剩余的20%(仅由老年代组成)构成可选部分。

G1完成强制部分的收集后,如果还有剩余时间,G1会以更细粒度的级别开始收集可选部分。此可选部分的收集粒度取决于剩余的时间量,一次最多只能到一个区域。完成对可选部分的收集后,G1可以根据剩余时间决定停止集合。

随着收集预测再次变得准确,可选部分变得越来越小,直到强制部分再次包含所有待收集部分(即,G1完全依赖于其启发式)。如果预测再次变得不准确,则下一个集合将再次包含强制和可选部分。

通过G1更及时的返回未使用的内存

增强G1垃圾收集器,以便在空闲时自动将Java堆内存返回给操作系统

为了实现向操作系统返回最大内存量的目标,G1将在应用程序不活动期间定期尝试或触发并发周期以确定整体Java堆使用情况。这将导致它自动将Java堆的未使用部分返回给操作系统。同时,用户可主动选择full gc ,从而最大化的返回的未使用内存。

参考文档:
JDK 12 Release Notes

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值