jdk 15 主要的新特性参考:
openjdk JDK 15
baeldung New Features in Java 15
JDK 15 的新特性
Java 15 于2020年9月15日发布,包含新特性:
- 339: Edwards-Curve Digital Signature Algorithm (EdDSA)
- 360: Sealed Classes (Preview)
- 371: Hidden Classes
- 372: Remove the Nashorn JavaScript Engine
- 373: Reimplement the Legacy DatagramSocket API
- 374: Disable and Deprecate Biased Locking
- 375: Pattern Matching for instanceof (Second Preview)
- 377: ZGC: A Scalable Low-Latency Garbage Collector
- 378: Text Blocks
- 379: Shenandoah: A Low-Pause-Time Garbage Collector
- 381: Remove the Solaris and SPARC Ports
- 383: Foreign-Memory Access API (Second Incubator)
- 384: Records (Second Preview)
- 385: Deprecate RMI Activation for Removal
Edwards-Curve Digital Signature Algorithm (EdDSA)
Java 15 中增加了一个新的密码学算法,爱德华曲线算法(EdDSA)签名算法。它是由 Schnorr 算法发展而来,在 RFC8032 中被定义实现。
1 |
|
输出
1 | /HHS8ROwwZ/QkXslMhvPgtn2Gnolb6oPpMLIXrdjOCfYYRHdvZGbS0o1+Jy5lK6JbRNhsnba1eCYNuE25FQ8Dw== |
Sealed Classes (Preview)
密封类(预览特性)。当前java没有对继承提供细粒度的控制,一个类只能被继承或者使用final关键字不允许被继承,无法灵活的设定被哪些指定的类继承,Java 15尝试解决这个问题,引入了 sealed 类,被 sealed 修饰的类可以指定子类。
这样这个类就只能被指定的类继承。而且 sealed 修饰的类的机制具有传递性,它的子类必须使用指定的关键字进行修饰,且只能是 final、sealed、non-sealed 三者之一。
密封类涉及两个新关键字 sealed 和 permits:
1 | public abstract sealed class Person |
定一个Person的类,且指名这个类只能被 Employee 和 Manager 继承:
1 | public final class Employee extends Person { |
这种通过密封类的有限继承的好处:
1 | if (person instanceof Employee) { |
编译器可以清楚的知道所有的子类是否被if覆盖。在以前这是难以实现的。
Hidden Classes(JEP 371)
隐藏类的目的是允许在运行时创建不可发现的类(也不能被反射发现),而且类的生命周期是有限的,所以此种类可以被高效的加载和卸载,可以减少内存使用。 虽然当前也可以通过Unsafe API来创建匿名类实现隐藏类这种效果,但毕竟是不安全的,隐藏类可没有这些限制。
这个特性对于大多开发者来说其实没啥好处,主要是给动态字节码、GVM开发的人用的,不做详细介绍了。
Remove the Nashorn JavaScript Engine(JEP 372)
Nashorn JavaScript 引擎在 Java 8 中被引入,在 Java 11 中被标记为废弃。由于 ECMAScript 语言发展很快,维护 Nashorn JavaScript 的成本过于高昂,在 Java 15 中被彻底删除。
Reimplement the Legacy DatagramSocket API
Java 13 中重新实现了旧的 Socket API,在介绍 Java 13 时还有一部分做了这方面的介绍。
现在,Java 15 重新实现了遗留的 DatagramSocket。
Disable and Deprecate Biased Locking
Java 15中 禁用和废弃偏向锁。
在之前,JVM 在处理同步操作,如使用 synchronized 同步时,有一套锁的升级机制,其中有一个锁机制就是偏向锁。然而通过目前的 Java 开发环境来看,使用这些被 synchronized 同步的类的机会并不多,如开发者更喜欢使用 HashMap 或者 ArrayList 而非 HashTable 和 Vector。
当初使用偏向锁是为了提高性能,如今看来性能提升的程度和使用次数都不多。而偏向锁的引入增加了 JVM 的复杂性。
所以现在偏向锁被默认禁用,在不久的将来将会彻底删除,对于 Java 15,我们仍然可以使用 -XX:+UseBiasedLocking 启用偏向锁定,但它会提示这是一个已弃用的 API。
Pattern Matching for instanceof (Second Preview)
instanceof 的模式匹配,二次预览。java 14的时候已经预览版本了,这次只是为了获取更多的反馈继续发布的二次预览版本,没有什么变动。
这个特性在 java 16中会成为正式特性。
ZGC: A Scalable Low-Latency Garbage Collector
ZGC 垃圾收集器在 Java 11 中被引入,但是因为收集器的复杂性,当初决定逐渐引入。然后不断的听取用户的反馈建议修复问题。而现在,已经很久没有收到用户的问题反馈了,ZGC 是时候投入正式使用阶段了。所以在 Java 15 中 ZGC 正式发布,可以使用下面的参数启用 ZGC。
1 | $ java -XX:+UseZGC className |
注意当前默认的垃圾回收器依然是G1。
Text Blocks(JEP 378)
文本块在 Java 12 JEP 326 中引入,在 Java 13 JEP 355 中开始预览,在 Java 14 JEP 368 中文本块第二次预览,终于在 Java 15 中成为正式特性了。
以前讲过了,和以前没有啥新的变化。
1 | String content = """ |
Shenandoah: A Low-Pause-Time Garbage Collector
Shenandoah 垃圾收集器在 Java 12 中开始引入,Java 15 中成为了正式功能的一部分,可以使用下面的参数启用 Shenandoah 垃圾收集器。
1 | java -XX:+UseShenandoahGC |
但是 openJDK 15 中默认没有 Shenandoah 收集器,想要使用此功能可以下载 AdoptOpenJDK 。
为什么 openJDK 中没有 Shenandoah 垃圾收集器?
Shenandoah 是一个高性能、低暂停时间的垃圾收集器,它是 Red Hat 主导的项目。当 Red Hat 第一次提议将 Shenandoah 贡献给 OpenJDK 时,Oracle 明确表示不想支持它,OpenJDK 作为一个免费软件,不想支持 Red Hat 的 Shenandoah 完全没有问题。
最后 Red Hat 选择和 Oracle 合作设计一个真正干净的可插拔垃圾收集器接口,允许任何人轻松选择垃圾收集器以包含在他们的构建中。最终 Shenandoah 进入了 JDK 12,但是没有构建进 OpenJDK。
Remove the Solaris and SPARC Ports
删除一些对 Solaris 端口的支持。无关紧要。
Foreign-Memory Access API (Second Incubator)
继续孵化,没啥好说的。
Records (JEP 384)
二次预览版本,Java 15 中对 Record 进行了增强。使它可以支持密封类型、Record 注解以及相关的反射 API 等。
1 | public sealed interface DataBase permits DataBaseSelect, DataBaseUpdate { |
record也允许我们重载一些默认的行为,比如在典型的构造函数里面加上校验:
1 | public record Person(String name,int age) { |
注意下写法,Person默认构造函数没有参数。
Deprecate RMI Activation for Removal
只是废弃 RMI 激活机制,不影响 RMI 其他功能。