JDK 21来了

2023-09-19 23:50:40 浏览数 (2)

前言

OpenJDK:https://openjdk.org/projects/jdk/21/

按排期来说,今天是JDK21 GA的日子

JDK21 ScheduleJDK21 Schedule

GA:(general availability)正式发布的版本,国外通常用 GA 来标识 release 版本,GA 版本是开发团队认为该版本是稳定版

JDK ReleaseJDK Release

从图可以看出,自从 2017 年后,升级以 6 个月为周期。速度相当快。

当正在写本文章时候,Last update从9月1日变为了9月19日

一. 新功能

按照官方文档部分解读

这是windows下载地址

windows: https://download.oracle.com/java/21/latest/jdk-21_windows-x64_bin.zip

1.1 Features

430: String Templates (Preview)

String模板预览版,这听起来像JavaScript的功能

代码语言:java复制
String name = "Joan";
String info = STR."My name is {name}";
assert info.equals("My name is Joan");   // true

当我们在使用大量的字符串拼接功能时候,各个方法都有写起来不舒服的地方,比如String的一堆 号,再比如StringBuilder的一堆append,format功能的下标问题等。

文档中还详细举例了其他语言的插值写法,最后诞生了Java的语法。


431: Sequenced Collections

序列化Collections

在Java的这些容器中,序列化并没有在父接口Collection中实现,而是各自实现或者不实现。所以整体下来,所有容器就都保留着各自数据结构的优缺点。

所以,他们定义了一个新的序列化容器接口?

代码语言:java复制
interface SequencedCollection<E> extends Collection<E> {
    // new method
    SequencedCollection<E> reversed();
    // methods promoted from Deque
    void addFirst(E);
    void addLast(E);
    E getFirst();
    E getLast();
    E removeFirst();
    E removeLast();
}

看这几个方法也能明白,为部分操作优化了写法。


这里跳过了一些版本号是因为被破弃。

439: Generational ZGC

重量级 分代ZGC

各种优化,各种升级。但是我现在看不懂。等以后在研究


440: Record Patterns

记录模式

可以理解为自带Lombok


441: Pattern Matching for switch

switch的模式匹配

代码语言:java复制
static String formatterPatternSwitch(Object obj) {
    return switch (obj) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> obj.toString();
    };
}

内部做了一些防null处理,外部加了简化的语法糖,而且减少了忘记写break带来的问题。

在JDK8中,向switch传入null会报错


442: Foreign Function & Memory API (Third Preview)

翻译为外部函数?和内存API(第三次预览版)

用来替代经常出现漏洞的JNI


443: Unnamed Patterns and Variables (Preview)

未命名/匿名模式与变量(预览版)

配合Record出的匿名模式,和增强switch搭配。

匿名变量是下划线。

后者经常出现在声明但未使用的情景,比如想用foreach遍历,但不想用具体数据。

代码语言:java复制
(int x, int _) -> x   x

444: Virtual Threads

重磅级的虚拟线程

在Java以前的版本(包括预览版),线程的创建是内核态的,非常的占用资源。光是创建1000个空线程就有1G左右的内存。来到虚拟线程,切换到用户态,极大降低了消耗,提高了速度。

在很多语言中,这个也叫协程/纤程 内核态(Kernel Mode):也被称为系统模式,这是计算机系统中最高的权限级别。在这个模式下,程序可以访问计算机的硬件设备,如CPU、内存、硬盘等,并可以对这些设备进行控制和管理。比如,操作系统就运行在内核态,它可以管理系统中的各种资源,包括处理任务、分配内存、管理设备等。 用户态(User Mode):也被称为用户级别模式,这是计算机系统中较低的权限级别。在这个模式下,程序只能访问和操作特定的用户数据,不能直接访问硬件设备和其他重要的系统资源。用户程序运行在用户态,比如你的文档编辑器、游戏、浏览器等都运行在用户态。

更低的开销,更高的性能,语法无感切换。满眼只有四个字:遥遥领先。


剩下还是一些琐碎的更新,大都可以第三方实现。

445: Unnamed Classes and Instance Main Methods (Preview)

446: Scoped Values (Preview)

448: Vector API (Sixth Incubator)

449: Deprecate the Windows 32-bit x86 Port for Removal

451: Prepare to Disallow the Dynamic Loading of Agents

452: Key Encapsulation Mechanism API

453: Structured Concurrency (Preview)

445: 未命名类和实例主方法(预览) 446:作用域值(预览) 448:向量 API(第六期孵化器) 449: 过时删除 Windows 32 位 x86 端口 451: 准备禁止代理的动态加载 452:密钥封装机制 API 453:结构化并发(预览版)

1.2 值得期待

你升任你升,我用Java 8。

随着GC的升级迭代,虚拟线程的正式上线,如果你对Java性能有需求,那么是时候考虑实践一下了。

二. 云原生时代下的Java

云原生是基于分布部署和统一运管的分布式云,以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系,它不仅仅是指一些具体的技术,更多指的是一套方法论和技术体系的集合,是一种文化。

2.1 Java的现状

  • 一次编写,到处运行。

这是我们大多数学习Java听到的一句话。平台无关性使得Java开发者不必担心操作系统。然后随着容器技术的出现,平台无关似乎没那么重要。并且,多了一个中间商,速度也比其他语言慢一些。

  • 健壮的生态

新出的语言即使性能再好,也没办法一下取代Java的地位。甚至可以基于Java的框架来实现其他语言对应的框架。(例如 Dubbo go)但是成也生态,败也生态。

如果JDK想大变动,那么跟着的生态也需要同样的变革。比如JDK 17中一个包名的变动,导致很多框架启动就出现错误,甚至不可使用。早期的Spring boot3就是一个经常开荒的案例。

  • 新的JVM

为了加速云原生,出现了GraalVM:https://www.graalvm.org/

This release takes AOT performance to the next level and ships G1 GC for AArch64 as well as new Java 21 features such as virtual threads.

上边来自官网首页,可以看出,活跃度蛮高的。

他的出现带来了什么

我们知道Java是半解释半执行。那么就有了即时编译(JIT):可以实现动态代理,反射等,并且出现了我们所说的AOP,当然这牺牲了一部分性能;运行前编译(AOT):全编译提升运行速度,牺牲了反射。

GraalVM的出现就是为了缩小这一差距,从而实现:不用任何解释器就可运行。

2.2 未来的Java预言

现在习惯新设计以Next结尾,那么我姑且称之为Java Next

不破不立,Spring boot3就是一个代表,未来会更多的强制需求,升级JDK版本。

抛弃JVM,轻量级的Java甚至运行在浏览器上。

融合AI,AI看起来发展很快,但其实他才三十多岁,并且大概每十年出现一个现象级产品。如果编程也更加智能,那么Java依然是首选。


我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

0 人点赞