前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDK 21来了

JDK 21来了

原创
作者头像
花花Binki
发布2023-09-19 23:50:40
1.2K0
发布2023-09-19 23:50:40
举报
文章被收录于专栏:岚的工作随笔岚的工作随笔

前言

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

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

JDK21 Schedule
JDK21 Schedule

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

JDK Release
JDK 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腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一. 新功能
    • 1.1 Features
      • 1.2 值得期待
      • 二. 云原生时代下的Java
        • 2.1 Java的现状
          • 他的出现带来了什么
        • 2.2 未来的Java预言
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档