你好呀,我是歪歪。

朋友们,好消息,好消息,重磅好消息。

从今年年初就一直在喊的具有革命性、未来性、开创新纪元的 JDK 21 按照官方的时间计划表,今天终于是要正式 GA 了:

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

GA,就是我上面框起来的“General Availability”的缩写,直译成中文,虽然是“普通可用”的意思,但是在软件行业,它就代表正式版。

如果对外发布一个 GA 版本,就意味着这个版本已经经过全面的测试,不存在任何重大的 bug,可供普通用户进行使用。

既然说到 GA 了,歪师傅也顺便给大家普及一下一般我们看到的版本号的含义。

比如我们经常会看到一些软件发布的时候都会带上 Alpha、Beta、Gamma、RC 等等这些莫名其妙的单词,它们代表什么意思呢?

  • Alpha:软件或系统的内部测试版本,仅内部人员使用。一般不向外部发布,通常会有很多 Bug,除非你也是测试人员,否则不建议使用,alpha 就是 α,是希腊字母的第一位,表示最初级的版本,beta 就是 β,alpha 版就是比 beta 还早的测试版,一般都是内部测试的版本。
  • Beta:公开测试版。β 是希腊字母的第二个,顾名思义,这一版本通常是在 Alpha 版本后,该版本相对于 Alpha 版已有了很大的改进,消除了严重的错误,但还是存在着一缺陷,需要经过多次测试来进一步消除。这个阶段的版本会一直加入新的功能。
  • Gamma:
    软件或系统接近于成熟的版本,只需要做一些小的改进就能发行。是 beta 版做过一些修改,成为正式发布的候选版本。
  • RC:Release Candidate,发行候选版本。和 Beta 版最大的差别在于 Beta 阶段会一直加入新的功能,但是到了 RC 版本,几乎就不会加入新的功能了,而主要着重于除错。RC 版本是最终发放给用户的最接近正式版的版本,发行后改正 bug 就是正式版了,就是正式版之前的最后一个测试版。
  • GA:General Available,正式发布的版本,这个版本就是正式的版本。在国外都是用 GA 来说明 release 版本的。比如:MySQL Community Server 5.7.21 GA 这是 MySQL Community Server 5.7 第 21 个发行稳定的版本,GA 意味着 General Available,也就是官方开始推荐广泛使用了。
  • Release:这个版本通常就是所谓的“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本,该版本有时也称为标准版。一般情况下,Release 不会以单词形式出现在软件封面上,取而代之的是符号(R)。
  • Stable:稳定版。在开源软件中,都有 stable 版,这个就是开源软件的最终发行版,用户可以放心大胆的用了。这一版本基于 Beta 版,已知 Bug 都被修复,一般情况下,更新比较慢。

除了上面的这些之外,我们还经常看见一个 LTS 的版本号。

LTS,Long Term Support,长期支持版,是指针对软件的某一版本,提供长时间的技术支持、安全更新和错误修复。

相对于非 LTS 版本,LTS 版本被认为是更为稳定、可靠和安全的版本。因此,在需要稳定性和安全性较高的场景中,如生产环境、企业级应用等,LTS 版本得到广泛的应用。

在 Java 领域,LTS 版本是指 Oracle 公司发布的 Java SE(Standard Edition,标准版)中,每隔一段时间发布一个长期支持版本。

自 2018 年开始,Oracle Java SE 8 、Java SE 11、Java SE 17 成为了 LTS 版本,分别提供了 3 年、 8 年、至少 3 年的支持。

你看,一个小小的 GA 里面,隐藏了这么多的小知识点,让歪师傅一不小心就铺(水)垫(了)这么长。

说会到 JDK 21 今天的 GA 版本,一共发布了 15 个新特性:

一眼望去,其中最扎眼的,也是描述最短的一个 Feature 是 444 号 Virtual Threads:

https://openjdk.org/jeps/444

可以说这个特性就是 JDK 21 这个版本中最受瞩目、最值得期待的一个特性了。

Virtual Threads,就是虚拟线程,从 JDK 19 吆喝到 JDK 20,终于在 JDK 21 现真身了。

前面我形容 JDK 21 的时候提到了一个词:开创新纪元。

值得就是它,根据官方介绍,虚拟线程的出现,确实是开启了并发编程的新纪元,轻量且高效,用更少的开销,处理更多的任务。

最重要的是看看这个:

来,翻译翻译,什么叫做“minimal change”?

minimal,就是小小的也很可爱,就是“极小的”。

change,就是变化。

官方表示,使用 java.lang.Thread API 的现有代码,只需做 极少改动(minimal change)即可启用虚拟线程。

少到你升级到 JDK 21 之后,只需要把创建线程池的地方修改为这样就能启用虚拟线程:

至于这个玩意到底有多牛逼,你可以随便在网上检索一下,已经有很多相关的文章了。

但是我还是建议你直接看官方的这个描述,这才是第一手资料出现的地方,如果让我来描述,我也只能是对于官方文章进行拙劣的翻译。

https://openjdk.org/jeps/444

除了 444 之外,也有其他的很多实用的特性。

根据官方的信息,它们把这 15 个新特性按照 JEP 的形式分为四类:核心 Java 库,Java 语言规范,HotSpot 和安全库。

https://www.infoq.com/news/2023/09/java-21-so-far/

纳入核心 Java 库的 6 个新特性分别是:

  • JEP 431:序列集合
  • JEP 442:外部函数和内存 API(第三次预览)
  • JEP 444:虚拟线程
  • JEP 446:作用域值(预览)
  • JEP 448:Vector API (第六次孵化器)
  • JEP 453:结构化并发(预览)

纳入 Java 语言规范的 5 个新特性分别是:

  • JEP 430:字符串模板(预览)
  • JEP 440:记录模式
  • JEP 441:switch 模式匹配
  • JEP 443:未命名模式和变量(预览)
  • JEP 445:未命名类和实例主方法(预览)

纳入 HotSpot 的 3 个新特性分别是:

  • JEP 439:分代 ZGC
  • JEP 449:弃用 Windows 32 位 x86 移植
  • JEP 451:准备禁止动态加载代理

纳入安全库的 1 个新特性是:

  • JEP 452:密钥封装机制 API

其中 445 号提案,也小小的火了一把,因为它被大多数网友调侃为“卵用不大”。

因为这个提案是为了简化 Hello World 的写法。

https://openjdk.org/jeps/445

在这个提案中,作者认为我们的 Hello World 太复杂了,要写这么多代码:

  1. public class HelloWorld { 
        public static void main(String[] args) { 
            System.out.println("Hello, World!");
        }
    }

所以他提议,为了 students 和 beginner 更快更好的入门 Java,应该简化成这样,

但是这个提案也强调了:这是预览语言功能,默认禁用。

如果你要用,需要这样操作:

  • 用 javac --release 21 --enable-preview Main.java 编译程序,用 java --enable-preview Main 运行程序。
  • 或者,当使用源代码启动器 source code launcher,时,用 java --source 21 --enable-preview Main.java 运行程序。

对于这个功能,怎么说的?

我的评价是:这很难评。

最后,再说一下编号为 439 的提案。

https://openjdk.org/jeps/439

ZGC,大家不陌生了吧?

这个提案提到它是干啥呢?

目前的版本中,ZGC 都是不分代 GC 的。在 JDK 21 的版本中,提供了分代 GC 的功能,但是默认是关闭状态,需要通过配置打开:

而且,注意最后这句话:

In a future release we intend to make Generational ZGC the default, at which point -XX:-ZGenerational will select non-generational ZGC. In an even later release we intend to remove non-generational ZGC, at which point the ZGenerational option will become obsolete.

在未来的版本中,官方会把 ZGenerational 设为默认值,即默认打开 ZGC 的分代 GC。

在更晚的版本中,官方会考虑删除 ZGC 的不分代 GC 功能,到时候 ZGenerational 这个配置就会被一并“优化”。

说到这个 ZGC 的分代 GC,我突然想起了一个有意思的问题。

就是 2018 年,在 JDK 11 的里面,刚刚开始宣传 ZGC 的时候,就有人问:ZGC 为什么不进行分代啊?

关于这个问题,我在 R 大那里看到了一个权威的回答:

https://www.zhihu.com/question/287945354/answer/458761494

没有什么特别的原因,就是“因为分代实现起来麻烦,想先实现出比较简单可用的版本”而已。

这句话,像不像我们常常听到的:先跑起来再说?

但是人家的“跑起来再说”和我们的“跑起来再说”完全不是一个维度的东西。

至少,人家提供的“跑起来”的版本,从 2018 年跑到了 2023 年,5 年时间。

而你的“跑起来再说”可能一周后就接到了全新的、不兼容的需求。

5 年就更别想了,业务可能都被砍了,跑不起来了。(手动狗头)

既然都提到了 ZGC 了,那就顺便提一嘴 Shenandoah 吧。

根据官方的消息,最开始 JDK 21 的版本中是包含了 Shenandoah 的。

https://openjdk.org/jeps/404

但是为什么 GA 版本中没有看到它的影子呢?

可以看看官方 6 月份的这个邮件:

https://mail.openjdk.org/pipermail/jdk-dev/2023-June/007959.html

别问,问就是时间紧,任务重,申请延期。

首先描述了原因:

Given the risks identified during the review process and the lack of time available to perform the thorough review that such a large contribution of code requires

因为 Shenandoah 在审查的过程中发现了明确的风险,并且没有足够的时间来进行针对大量代码改动所需的评审。

然后画了一个新饼:

take the time to deliver the best Generational Shenandoah that we can.

Shenandoah 团队决定“尽他们所能提供最好的分代 Shenandoah”。

并给自己设置了一个新任务,将 JDK 22 作为发布目标:

We will seek to target JDK 22.

能怎么办,等着呗。

反正你发任你发,我用 Java 8!

话虽然是这么说,但是我还是希望在我短暂的职业生涯中,有幸能在生产上使用到 JDK 21,体会一下虚拟线程和 ZGC 带来的双重服务。

朋友们,就在今天,JDK 21,它终于带着重磅新特性正式发布了!的更多相关文章

  1. Java JDK 1.5 1.6 1.7 新特性整理

    Java JDK 1.5的新特性 1.泛型 List<String> strs = new ArrayList<String>();//给集合指定存入类型,上面这个集合在存入数 ...

  2. JDK 7中的文件操作的新特性

    文件系统综述 一个文件系统在某种媒介(通常是一个或多个硬盘)上存储和组织文件.如今的大多数文件系统都是以树状结构来存储文件.在树的顶端是一个或多个根节点,在根节点一下,是文件和目录(在Windows系 ...

  3. 说出 JDK 1.7 中的三个新特性?

    虽然 JDK 1.7 不像 JDK 5 和 8 一样的大版本,但是,还是有很多新的特性, 如 try-with-resource 语句,这样你在使用流或者资源的时候,就不需要手动关 闭,Java 会自 ...

  4. JDK各个版本的新特性

    对于很多刚接触java语言的初学者来说,要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升级的新特性,这样才能循序渐进的学好一门语言.今天先为大家介绍一下JDK1.5版本到JD ...

  5. 译文《全新首发JDK 16全部新特性》

    封面:洛小汐 译者:潘潘 JDK 8 的新特性都还没摸透,JDK 16 的新特性就提着刀来了. 郑重申明: 第一次冒险翻译专业领域的文献,可想而知,效果特别糟糕.一般翻译文献特别是 技术专业领域 的内 ...

  6. JDK 16 正式发布,一次性发布 17 个新特性…不服不行!

    上一篇:Java 15 正式发布, 14 个新特性 JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. ...

  7. JDK各个版本的新特性jdk1.5-jdk8

    JDK各个版本的新特性 对于很多刚接触java语言的初学者来说,要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升级的新特性,这样才能循序渐进的学好一门语言.今天先为大家介绍一 ...

  8. JDK各版本新特性!

    1.JDK1.5 新特性 1.自动装箱与拆箱:自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中.自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取 ...

  9. JavaEE基础(二十七)/反射、JDK新特性

    1.反射(类的加载概述和加载时机) A:类的加载概述 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载  就是指将class文件读入 ...

  10. jdk 1.6 & 1.7新特性

    jdk1.6新特性 1.Desktop类和SystemTray类 2.使用JAXB2来实现对象与XML之间的映射 3.StAX 4.使用Compiler API 5.轻量级Http Server AP ...

随机推荐

  1. games101-1 光栅化与光线追踪中的空间变换

    在学习了一些games101的课程之后,我还是有点困惑,对于计算机图形学的基础知识,总感觉还是缺乏一些更加全面的认识,幸而最*在做games101的第五次作业时,查询资料找到了scratchpixel ...

  2. DM数据库 回表优化案例

    京华开发一哥们找我优化条SQL,反馈在DM数据库执行时间很慢需要 40s 才能出结果,安排. 原SQL: SELECT A.IND_CODE, A.IND_NAME AS "specialN ...

  3. pbootcms 后台内容列表搜索功能扩展及增加显示字段功能

    应项目要求,一个内容模型下栏目不宜分的层级过多,如新闻模块,分2022.2023.2024年度,每年度下分12个月,这样就是2层栏目,再依类别(科技.动漫.电影...)划分层级,栏目数量较多,而且不易 ...

  4. 好用的解决PowerDesign中字体图片太小分辨率问题【已解决】

    熟悉数据库设计的小伙伴可能都会用到一款名叫PowerDesign的工具 但是我在使用这款工具时候发现界面中的图标和文字都非常小,看的人眼睛疼,如下图 我刚开始修改了软件的字体大小,发现只是字稍微大了点 ...

  5. 学生开发者勇担青年使命,用AI守护少数人的“视界”

    本文分享自华为云社区<[先锋开发者云上说]学生开发者勇担青年使命,用AI守护少数人的"视界">,作者:华为云社区精选 . 青年动人之处,在于他们的勇气,和非凡的创造探索 ...

  6. 解密Spring Cloud微服务调用:如何轻松获取请求目标方的IP和端口

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 目的 Spring Cloud 线上微服务实例都是2个起步,如果出问题后,在没有ELK等日志分析平台,如何确定调用到了目标 ...

  7. Ubuntu下使用apt-get命令查询并安装指定版本的软件

    执行以下命令,查询软件所有的版本号 sudo apt-cache madison <package> <package>为需要安装的包名,返回结果第二列即可用的版本号 执行以下 ...

  8. 学习JavaScript的第一天

    JavaScript概述 JavaScript的介绍 js属于一门面向对象的编程语言 属于跨平台 面向对象(oop) 以对象方式实现所有的功能 跨平台:js代码不论是在什么样的操作系统上执行结果都是一 ...

  9. 使用Spring Cache高效处理缓存数据

    Spring Cache是Spring框架提供的一种缓存抽象,可以有效地处理缓存数据.使用Spring Cache可以简化开发过程,提高应用程序的性能和可扩展性. 本文将详细介绍如何使用Spring ...

  10. Postgres 和 MySQL 应该怎么选?

    PostgreSQL和MySQL是两个流行的关系型数据库管理系统(DBMS).它们都具有一些相似的功能,但也有一些区别. 在选择使用哪个DBMS时,需要考虑多个因素,包括性能.可扩展性.安全性.功能丰 ...