引用参考文档链接
写在开头
- ZGC和Shenandoah 的可正式投产比较重要
- 隐藏类的使用场景不多,但是对于agent和平台框架开发人员来说比较重要
- 文本块的正式开放使用,喜大普奔,相较于以前的大文本操作用起来是真的舒服很多
新签名方案:EdDSA(爱德华兹曲线数字签名算法)
新增的签名方案,相比于现有的其他签名方案,它更快并且不降低安全性。可在TLS 1.3 中使用。
密封类(预调整)
使用sealed
修饰类后,通过permits
限制可以继承当前类的子类,避免无限制的继承扩张。
接口也是同样的使用规则。
1 | public abstract sealed class Shape |
子类必须是 final
或者 sealed
隐藏类
官方文档看的比较晦涩,可以浏览隐藏类使用案例进行初步的了解,该特性对于平台、框架、agent开发人员比较友好,正常的业务场景不会使用到该特性。
删除Nashorn JavaScript 引擎
删除 Nashorn JavaScript 脚本引擎和 API 以及该jjs 工具。JDK11标注弃用,JDK15删除。
重新实现 DatagramSocket API
用易于维护和调试的更简单、更现代的实现替换java.net.DatagramSocket和API的底层实现。
笔者未使用过,因此通过其他博主分享的文章了解DatagramSocket
是UDP通信的相关类。网络编程相关需要重点关注下。
弃用和禁用偏向锁
根据官方文档的说明
- 应用不会通过偏向锁获得明显的性能优化
- 偏向锁的维护成本较高,并且侵入了其他的HotSpot组件
因此,官方决定禁用并且弃用偏向锁。
实际的编码中,不会直接涉及偏向锁,主要是JVM内部实现涉及。
instanceof增强(第二次预调整)
This JEP proposes to re-preview the feature in JDK 15, with no changes relative to the preview in JDK 14, in order to gather additional feedback.
没变动,纯粹属于提个醒,想收集更多的反馈…..
ZGC可正式投产
默认仍是G1,通过启动参数-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
启用
文本块
无新增调整,正式开放使用。
Shenandoah 可正式投产
默认仍是G1,通过启动参数-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC
启用。
本次无新增功能,并且Red Hat 8u与Red Hat 11u同步可正式投产使用。
删除 Solaris 和 SPARC 端口
JDK14标记弃用,本次迭代彻底删除。
- 删除所有特定于 Solaris 操作系统的源代码
- 删除特定于 SPARC 体系结构的所有源代码
外部内存访问 API(更新调整)
本次更新内容:
- 丰富的VarHandle组合器 API,用于自定义内存访问 var 句柄;
- 通过接口有针对性地支持内存段的并行处理Spliterator;
- 增强了对映射内存段的支持(例如,MappedMemorySegment::force);
- 支持串行限制的安全 API 点(例如,在两个线程之间转移线程所有权);和
- 不安全的 API 指向操作和取消引用来自例如本地调用的地址,或者将这些地址包装到合成内存段中
因为使用经验较少,对于更新内容无法作出总结…
新的数据建模方式 Records(第二次预调整)
- 适配了
sealed
1
2
3
4
5
6
7
8
9package com.example.expression;
public sealed interface Expr
permits ConstantExpr, PlusExpr, TimesExpr, NegExpr {...}
public record ConstantExpr(int i) implements Expr {...}
public record PlusExpr(Expr a, Expr b) implements Expr {...}
public record TimesExpr(Expr a, Expr b) implements Expr {...}
public record NegExpr(Expr e) implements Expr {...} - 可局部数据建模
1
2
3
4
5
6
7
8
9
10List<Merchant> findTopMerchants(List<Merchant> merchants, int month) {
// Local record
record MerchantSales(Merchant merchant, double sales) {}
return merchants.stream()
.map(merchant -> new MerchantSales(merchant, computeSales(merchant, month)))
.sorted((m1, m2) -> Double.compare(m2.sales(), m1.sales()))
.map(MerchantSales::merchant)
.collect(toList());
}
弃用 RMI(Remote Method Invocation) Activation
RMI 即 Remote Method Invocation ,其为 Java 提供了远程方法调用的能力,不过,比较鸡肋,基本不会用到。RMI Activation 为激活分布式对象提供支持,不过,一般也不会用到。