关注Java动态的朋友们都知道,JDK版本迭代以每年升两阶的速度在快速生长,分别在每年的3月中和9月中,如今,JDK15已在9月15日如期发布,到底最新版本给我们带来了哪些惊喜呢?
JDK15新特性
看下14个最新特性 https://www.oracle.com/java/technologies/javase/15all-relnotes.html
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 |
-
339 Edwards-Curve Digital Signature Algorithm (EdDSA)
椭圆曲线数字签名算法:使用 Edwards-Curve 数字签名算法(EdDSA)实现加密签名。与其它签名方案相比,EdDSA 具有更高的安全性和性能,并且已在许多其它加密库(如 OpenSSL 和 BoringSSL)中得到支持。在比特币的交易中也应用到了该算法。
-
360 Sealed Classes (Preview)
封闭类(预览特性),用于限制超类的使用,密封的类和接口限制其它可能继承或实现它们的其它类或接口。
这个厉害了,我们知道使用最广泛的String类通过final限制符来限定其不能被继承,但在实际业务场景中,我们期望自己的业务类能有限的别继承或现实,不期望随意被继承,那么限制Sealed Class的出现就能满足我们的期望了。请看示例
public abstract sealed class Furniture permits Sofa,Desk,Chair {
}
Furniture类被sealed修饰,限制只能被Sofa,Desk,Chair三个类继承,是不是很使用。
-
371 Hidden Classes
隐藏类,隐藏类是框架开发人员最感兴趣的功能。创建不能被其他类的字节码直接使用的类,供框架本身使用,这些框架本身在运行时生成类并通过反射间接使用它们。更多特性可以通过官方JEP中了解https://openjdk.java.net/jeps/371。
-
372 Remove the Nashorn JavaScript Engine
移除了 Nashorn JavaScript 脚本引擎、APIs,以及 jjs 工具。这些早在 JDK 11 中就已经被标记为 deprecated 了,JDK 15 被移除就很正常了。
WHY?
官方的描述是,随着 ECMAScript 脚本语言的结构、API 的改编速度越来越快,维护 Nashorn 太有挑战性了,所以……
373 Reimplement the Legacy DatagramSocket API
代码库java.net.DatagramSocket以及java.net.MulticastSocketAPI及其底层实现既古老又脆弱,重新实现了老的 DatagramSocket API 接口,更改了 java.net.DatagramSocket 和 java.net.MulticastSocket 为更加简单、现代化的底层实现,更易于维护和调试。
新的底层实现将很容易使用虚拟线程,目前正在 Loom 项目中进行探索。这也是 JEP 353 的后续更新版本,JEP 353 已经重新实现了 Socket API。
-
374 Disable and Deprecate Biased Locking
默认情况下禁用偏向锁定,并取消所有相关的命令行选项。由于维护成本太高,后续再确定是否需要继续支持偏锁的遗留同步优化。
偏置锁定是HotSpot中用来减少非竞争锁开销的一种优化技术。它的目的是避免在获取监视器时执行比较和交换原子操作,方法是假定在另一个线程尝试获取监视器之前,该监视器仍然属于给定线程。监视器的初始锁使监视器偏向该线程,从而避免了在对同一对象的后续同步操作中需要原子指令。当许多线程在以单线程方式使用的对象上执行许多同步操作时,与常规锁定技术相比,偏移锁在历史上导致了显著的性能改进。
-
375 Pattern Matching for instanceof (Second Preview)
这个instanceof的模式匹配(第二次预留),非常实用的改进,让Java代码更优雅。直接上代码对比
before
if (obj instanceof String) {
String s = (String) obj;
}
now
if (obj instanceof String s) {
// use s
}
还可以更骚一些
if (obj instanceof String s && s.length() > 666) {
// use s
}
-
377 ZGC: A Scalable Low-Latency Garbage Collector
将Z垃圾回收器从实验特性更改为产品特性,终于过了试用期转正了。自从JDK11引入ZGC以来,收到了多用户积极的反馈,已经解决了许多bug,并且我们还添加了一些特性和增强功能。要突出一些更重要的问题:
Concurrent class unloading
Uncommitting unused memory (JEP 351)
Maximum heap size increased from 4TB to 16TB
Minimum heap size decreased to 8MB
-XX:SoftMaxHeapSize
Support for the JFR leak profiler
Support for class-data sharing
Limited and discontiguous address spaces
Support for placing the heap on NVRAM
Improved NUMA awareness
Multi-threaded heap pre-touching
Furthermore, all commonly used platforms are now supported:
Linux/x86_64 (JEP 333)
Linux/aarch64 (8214527)
Windows (JEP 365)
macOS (JEP 364)
更牛逼的是,几个月来没有收到新的ZGC特有的bug。有了ZGC今天所拥有的稳定性、特性集和平台支持,现在是时候取消它的试验状态并使其成为产品特性了。
-
378 Text Blocks
这个特性太实用了,恨不得搬到JDK8中来,直接上代码看新特性的亮点。
HTML example
传统方式:
String html = "<html>n" +
" <body>n" +
" <p>Hello, world</p>n" +
" </body>n" +
"</html>n";
文本块方式:
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
SQL example
传统方式:
String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`n" +
"WHERE `CITY` = 'INDIANAPOLIS'n" +
"ORDER BY `EMP_ID`, `LAST_NAME`;n";
文本块方式:
String query = """
SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
WHERE `CITY` = 'INDIANAPOLIS'
ORDER BY `EMP_ID`, `LAST_NAME`;
""";
-
379 Shenandoah: A Low-Pause-Time Garbage Collector
跟ZGC类似,新的垃圾回收器Shenandoah也实验特性更改为产品特性,Shenandoah是一款concurrent及parallel的垃圾收集器;跟ZGC一样也是面向low-pause-time的垃圾收集器,不过ZGC是基于colored pointers来实现,而Shenandoah GC是基于brooks pointers来实现。对Shenandoah的深入了解,可以了解官方信息。
-
381 Remove the Solaris and SPARC Ports
删除源代码并构建对Solaris/SPARC、Solaris/x64和Linux/SPARC端口的支持。这些端口在JDK14中被弃用,目的是在将来的版本中删除它们。
WHY?
目前正在开发的许多项目和特性,如Valhalla、 Loom and Panama,都需要对CPU架构和操作系统特定代码进行重大更改。放弃对Solaris和SPARC端口的支持将使OpenJDK社区中的贡献者能够加速开发将推动平台前进的新功能。说白了,兼容性越强,维护代价越高。
-
383 Foreign-Memory Access API (Second Incubator)
对外存内存访问 API(二次孵化),可以允许 Java 应用程序安全有效地访问 Java 堆之外的外部内存。这个最早在 JDK 14 中成为孵化特性,JDK 15 继续二次孵化并对其 API 有了一些更新。
-
384 Records (Second Preview)
重点看看这个特性。未来能不能丰富干掉Lombok?早在2019年2月份,Java 语言架构师 Brian Goetz,曾经写过一篇文章,详尽的说明了并吐槽了Java语言,他和很多程序员一样抱怨“Java太啰嗦”或有太多的“繁文缛节”,他提到:开发人员想要创建纯数据载体类(plain data carriers)通常都必须编写大量低价值、重复的、容易出错的代码。如:构造函数、getter/setter、equals()、hashCode()以及toString()等。
以至于很多人选择使用IDE的功能来自动生成这些代码。还有一些开发会选择使用一些第三方类库,如Lombok等来生成这些方法,从而会导致了令人吃惊的表现(surprising behavior)和糟糕的可调试性(poor debuggability)。
record 关键字用于声明充当“数据载体”的特殊类类型,即领域模型类或 POJO 类。
record Point(int x, int y) { }
Java 编译器将为 record 类型生成 equals(),hashCode(),toString() 方法,以及生成适当的构造函数,并且为所有字段生成 getter 和 setter 。上面的 record 类型 Point 等效于以下 class 代码:
public class Point { private int x; private int y;
public Point(int x, int y) { this.x = x; this.y = y;
}
public void setX(int x) { this.x = x;
}
public int getX() { return this.x;
}
public void setY(int y) { this.y = y;
}
public int getY() { return this.y;
}
public boolean equals(Object obj) { // implement equals based on fields x and y
}
public int hashCode() { // implement hashCode based on fields x and y
}
public String toString() { // implement toString based on fields x and y
}
}
-
385 Deprecate RMI Activation for Removal
弃用RMI激活机制以便将来删除。RMI激活是RMI中一个过时的部分,自java8以来一直是可选的。RMI的其他部分不会被弃用。说白了,过时了。
结束语
是不是有很多小伙伴有这种感慨:不管你JDK怎么升级,我依然对JDK8情有独钟。别着急,JDK15依然不是长期维护版本,JDK8之后的长期维护版本是JDK11,Java 11 不仅提供了长期支持服务,还将作为 Java 平台的参考实现。Oracle 直到2023年9月都会为 Java 11 提供技术支持,而补丁和安全警告等扩展支持将持续到2026年。新的长期支持版本每三年发布一次,根据后续的发布计划,下一个长期支持版 Java 17 将于2021年发布,让我们拭目以待!
附上版本维护周期
Oracle Java SE Support Roadmap*† | ||||
---|---|---|---|---|
Release | GA Date | Premier Support Until | Extended Support Until | Sustaining Support |
7 | July 2011 | July 2019 | July 2022***** | Indefinite |
8** | March 2014 | March 2022 | December 2030 | Indefinite |
9 (non‑LTS) | September 2017 | March 2018 | Not Available | Indefinite |
10 (non‑LTS) | March 2018 | September 2018 | Not Available | Indefinite |
11 (LTS) | September 2018 | September 2023 | September 2026 | Indefinite |
12 (non‑LTS) | March 2019 | September 2019 | Not Available | Indefinite |
13 (non‑LTS) | September 2019 | March 2020 | Not Available | Indefinite |
14 (non‑LTS) | March 2020*** | September 2020 | Not Available | Indefinite |
15 (non‑LTS) | September 2020*** | March 2021 | Not Available | Indefinite |
原文始发于微信公众号(三维家技术实践):JDK15都发布了,你还在用JDK8吗?
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/30682.html