java21特性学习

jdk21下载地址

JDK21文件

JDK21是javaSE平台最新的长期支持版本。

Java SE

Java Archive | Oracle

JDK21版本说明

JDK 21 Release Notes, Important Changes, and Information

JavaSE 版本字符串格式

Version-String Format


JavaSE平台采用了基于时间的发布模型,JDK每六个月发布一次。

自JDK10及以后,版本字符串的格式反映了JavaSE平台基于时间的发布模型。$FEATURE.$INTERIM.$UPDATE.$PATCH .

$FEATURE为每个功能发布增加的版本号。该功能发布包含新的功能和对现有功能的更改,由JavaSE平台规范指定。版本号每六个月递增一次。例如,2018年3月v的版本号是10,2018年9月v的版本号是11,等等。

$INTERIM为每个临时版本添加的版本号,其中包含错误修复和增强。临时版本不包含不兼容的更改、特性清除,也不包含对标准API的任何更改。临时版本的版本号总是0(0),因为6个月版本模型不包括临时版本。但是,这个版本号是为将来的临时版本保留的,如果有的话。

$UPDATE 为更新版本增加的版本号,其中包括新功能中的安全问题、回归和错误的修复。该版本编号在$FEATURE 每三个月释放一次。例如,10月更新版的完整版本字符串是 21 .1月份更新版的完整版本字符串是 21 .0.2,等等。

$PATCH用于紧急补丁发布以修复一个关键问题的递增版本号。

版本字符串没有尾随零元素。例如,如果$FEATURE 是 21 ,的价值$INTERIM 是0,值$UPDATE 它的价值是1$PATCH 是0,那么完整版本字符串是 21 .0.1.

JDK发行说明

JDK Release Notes

Java 21 还提供了数十个新功能和增强功能

Java 21 还提供了数十个新功能和增强功能,其中 15 个增强功能的重要性足以保证他们自己的JDK 增强提案 - JEP ,涵盖 6 个预览功能和 1 个孵化器功能。

特点

  • 430:    字符串模板(预览)
  • 431:    按顺序排列的收藏品
  • 439:    生成ZGC
  • 440:    记录模式
  • 441:    开关图案匹配
  • 442:    外部功能和内存API(第三预览)
  • 443:    未命名的模式和变量(预览)
  • 444:    虚拟线程
  • 445:    无名类和实例主要方法(预览)
  • 446:    标度值(预览)
  • 448:    病媒API(第六个孵化器)
  • 449:    反对Windows32位x86端口清除
  • 451:    准备禁止代理人的动态装载
  • 452:    关键封装机制API
  • 453:    结构并发(预览)
主要新功能
语言特征

JDK 21 Release Notes, Important Changes, and Information

新功能

已删除的特征和选项

虚拟线程

Virtual Threads官网说明

虚拟线程是轻量级线程,可以减少编写、维护和调试高吞吐量并发应用程序的工作量。

平台线程

Oracle官方文档的机器翻译:

平台线程是作为操作系统(OS)线程的瘦包装器实现的。
平台线程在其底层操作系统线程上运行Java代码,平台线程在平台线程的整个生命周期内捕获其操作系统线程。
因此,可用平台线程的数量受限于操作系统线程的数量。
平台线程通常有一个大的线程堆栈和其他由操作系统维护的资源。
平台线程支持线程局部变量。
平台线程适合运行所有类型的任务,但可能是有限的资源。

虚拟线程

Oracle官方文档的机器翻译:

与平台线程一样,虚拟线程也是 java.lang.Thread 的一个实例。
但是,虚拟线程并不依赖于特定的操作系统线程。
虚拟线程仍然在操作系统线程上运行代码。
但是,当虚拟线程中运行的代码调用阻塞 I/O 操作时,Java 运行时会挂起虚拟线程,直到可以恢复为止。
与挂起的虚拟线程关联的操作系统线程现在可以自由地为其他虚拟线程执行操作。

实现原理

虚拟线程的实现方式与虚拟内存类似。
为了模拟大量内存,操作系统将较大的虚拟地址空间映射到有限的 RAM。
同样,为了模拟大量线程,Java运行时将大量虚拟线程映射到少量操作系统线程。

与平台线程不同,虚拟线程通常具有浅调用堆栈,只执行单个 HTTP 客户端调用或单个 JDBC 查询。
尽管虚拟线程支持线程局部变量,但您应该仔细考虑使用它们,因为单个 JVM 可能支持数百万个虚拟线程。

虚拟线程适合运行大部分时间处于阻塞状态、通常等待 I/O 操作完成的任务。
但是,它们不适用于长时间运行的 CPU 密集型操作。

虚拟线程用法
Thread thread = Thread.ofVirtual().start(() -> System.out.println("Hello"));
thread.join();

try {
 Thread.Builder builder = Thread.ofVirtual().name("MyThread");
 Runnable task = () -> {
           System.out.println("Running thread");
      };
     Thread t = builder.start(task);
    System.out.println("Thread t name: " + t.getName());
            t.join();
} catch (InterruptedException e) {
      e.printStackTrace();
}

下面的示例创建和启动两个虚拟线程

public class CreateNamedThreadsWithBuilders {
    
    public static void main(String[] args) {
        
        try {
            Thread.Builder builder =
                Thread.ofVirtual().name("worker-", 0);

            Runnable task = () -> {
                System.out.println("Thread ID: " +
                    Thread.currentThread().threadId());
            };            

            // name "worker-0"
            Thread t1 = builder.start(task);   
            t1.join();
            System.out.println(t1.getName() + " terminated");

            // name "worker-1"
            Thread t2 = builder.start(task);   
            t2.join();  
            System.out.println(t2.getName() + " terminated");
            
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

这个例子打印输出类似于下列:

Thread ID: 21
worker-0 terminated
Thread ID: 24
worker-1 terminated

分代ZGC

JDK 21: The GCs keep getting better

  • JEP 目标:
    • 通过扩展 展 Z 垃圾收集器 ( ZGC ) 来维护新对象和旧对象的不同代,从而提高应用程序性能。
    价值:
    • 使用 Generational ZGC 运行的应用程序应该享受:
      • 降低分配停滞的风险。
      • 降低所需的堆内存开销。
      • 降低垃圾收集 CPU 开销。
    • 与非分代 ZGC 相比,这些好处应该不会显着降低吞吐量。应保留非代 ZGC 的基本属性:
    • 暂停时间不应超过 1 毫秒。
    • 应支持从几百兆字节到数 TB 的堆大小。
    • 应该需要最少的手动配置。

  • G1 -自JDK9以来的默认收集器,侧重于延迟和吞吐量之间的平衡
  • Parallel  -以通过为导向的收集器,可能会受到长时间的最坏情况的影响
  • Z -超低延迟替代方案,与次毫秒暂停完全同步

当涉及到原始吞吐量性能时,JDK17以来的收益并没有那么大,但仍略有增加。但是下面的图表中有两件事值得关注。首先,JDK8和最近的G1和并行JDKK之间的显著差异。从性能的角度来看,离开JDK8比现在更有好处。

使用一代ZGC时,10%的改进。ZGC中的新一代支持允许它更有效地回收内存,而不需要为每个GC考虑整个堆。效果是减少了CPU资源的花费,这些资源可以被应用程序用来提高其性能。

升级和试用一代ZGC

正如你所看到的,与JDK8相比,JDK21的性能显著地好。因此,如果您还在使用JDK8,您应该开始寻找升级。当升级的时候,也是重新评估使用哪个GC的好时机。如果搬到JDK21,我真的鼓励尝试代代相传的ZGC。在JDK21中,ZGC的代代版本和遗留模式都是可用的,要使用代代,您需要指定这两个标记:

JVM参数:
-XX:+UseZGC -XX:+ZGenerational

文章中放了很多官网的链接推荐自己去学习。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/252490.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟化之安全虚拟化

虚拟化首次引入是在Armv7-A架构中。那时,Hyp模式(在AArch32中相当于EL2)仅在非安全状态下可用。当Armv8.4-A引入时,添加了对安全状态下EL2的支持作为一个可选特性。 当处理器支持安全EL2时,需要使用SCR_EL3.EEL2位从E…

HarmonyOS:使用MindSpore Lite引擎进行模型推理

场景介绍 MindSpore Lite 是一款 AI 引擎,它提供了面向不同硬件设备 AI 模型推理的功能,目前已经在图像分类、目标识别、人脸识别、文字识别等应用中广泛使用。 本文介绍使用 MindSpore Lite 推理引擎进行模型推理的通用开发流程。 基本概念 在进行开…

【elementui笔记:el-table表格的输入校验】

之前做得比较多的校验是在el-form表单里做的,但有时也遇到,需要在table内输入数据,然后校验输入的数据是否符合要求的情况。因此记录一下。 思路: 1.需要借助el-form的校验,el-table外层嵌套一层el-form,使…

Java数组(1)

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 本…

离线无网络环境下配置Python/Anaconda环境踩过的坑

一、前言 如果你同样需要在无网络环境下安装Python环境,这篇博客是一个很好的参考,由于内网没有网络,因此不能使用conda install/pip install等在线下载安装方式,经过个人尝试,推荐以下两种方法。 二、离线安装python…

2023年陕西省安全员C证证考试题库及陕西省安全员C证试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2023年陕西省安全员C证证考试题库及陕西省安全员C证试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大…

MIT6.S081-实验准备

实验全程在Vmware虚拟机 (镜像:Ubuntu-20.04-beta-desktop-amd64) 中进行 一、版本控制 1.1 将mit的实验代码克隆到本地 git clone git://g.csail.mit.edu/xv6-labs-2020 1.2 修改本地git配置文件 创建github仓库,记录仓库地址 我的仓库地址就是htt…

基于AT89C51单片机的LED点阵显示屏设计

点击链接获取Keil源码与Project Backups仿真图: [[https://download.csdn.net/download/qq_64505944/88637464?spm1001.2014.3001.5503]] **[源码获取] B 源码仿真图课程设计50 工程实训(三)课题设计 班级: …

【面试】Java最新面试题资深开发-Java中的垃圾回收机制

问题七:Java中的垃圾回收机制 请简要解释Java中的垃圾回收机制是如何工作的,以及它的优缺点。如果可能,请提供一些垃圾回收器的例子,以及它们在不同场景中的适用性。 Java垃圾回收机制 工作原理: Java垃圾回收机制…

linux(centos7)离线安装mysql-5.7.35-1.el7.x86_64.rpm-bundle.tar

1. 卸载mariadb相关rpm # 查找 rpm -qa|grep mariadb rpm -qa|grep mysql# 卸载 rpm -e --nodeps mariadb... rpm -e --nodeps mysql...2. 删除mysql相关文件 # 查找 find / -name mysql# 删除 rm -rf /var/lib/mysql...3. 查看是否有相关依赖,没有需安装 rpm -q…

考虑用序列化代理代替序列化实例

import java.io.*;// 用户类 class User implements Serializable {private String username;private String password;private String email;public User(String username, String password, String email) {this.username username;this.password password;this.email ema…

CentOS 7 部署 Nacos-2.3.0 (单机版)

CentOS 7 部署 Nacos-2.3.0 (单机版) 1. 下载 Nacos 安装包 历史版本:https://github.com/alibaba/nacos/releases/ 我选的是 2.3.0 版本,https://github.com/alibaba/nacos/releases/download/2.3.0/nacos-server-2.3.0.tar.g…

从传统型数据库到非关系型数据库

一 什么是数据库 数据库顾名思义保存数据的仓库,其本质是一个具有数据存储功能的复杂系统软件,数据库最终把数据保存在计算机硬盘,但数据库并不是直接读写数据在硬盘,而是中间隔了一层操作系统,通过文件系统把数据保存…

2023年12月5日,北京elastic Meetup 腾讯分享的搜索优化经验

1、减少长文本模糊匹配,降低 CPU 大量分词上的开销 长文本全文查询由于在查询时需要进行分词处理,因此在查询并发较大的情况下, cpu会先于IO被打满,从而出现大量的查询拒绝。 2、设置多副本提高并发和均衡单节点压力 Search查询请…

机器学习 | 线性算法 —— 大禹治水

Machine-Learning: 《机器学习必修课:经典算法与Python实战》配套代码 - Gitee.com 如果说KNN算法体现了人们对空间距离的理解, 那么线性算法则体现了人们对事物趋势上的认识。 注意图中横纵坐标的不同。 线性回归、多项式回归多用于预测,逻辑…

基于linux系统的Tomcat+Mysql+Jdk环境搭建(四)linux安装Mysql

1.切换到你需要安装mysql的路径 cd /root/usr/ 2.在线安装 安装网上的安装方式都有很多,可以自己百度一下 我们这里是自己搭建测试环境,可以直接选择在线安装,命令如下:yum install mysql-server, 但是我失败了 ┭┮…

蜂鸣器的工作原理

电路原理图使用SH69P43为控制芯片,使用4MHz晶振作为主振荡器。 PORTC.3/T0作为I/O口通过三极管Q2来驱动蜂鸣器LS1,而PORTC.2/PWM0则作为PWM输出口通过三极管Q1来驱动蜂鸣器LS2。另外在PORTA.3和PORTA.2分别接了两个按键,一个是PWM按键&#x…

使用 Wired XDisplay 连接失败的原因

使用 Wired XDisplay 连接扩展屏,有时候会连接不上 ,记下解决方法,以备后用: 1、扩展屏和主屏 一直在连接中,可能是其中一端没有提供数据访问权限 ps. 水果用户需要 打开 iTunes 并登陆 ,安卓用户 可能是 …

Mistral MOE架构全面解析

从代码角度理解Mistral架构 Mistral架构全面解析前言Mistral 架构分析分词网络主干MixtralDecoderLayerAttentionMOEMLP 下游任务因果推理文本分类 Mistral架构全面解析 前言 Mixtral-8x7B 大型语言模型 (LLM) 是一种预训练的生成式稀疏专家混合模型。在大多数基准测试中&…

1.Mybtis-Plus框架基本使用

Mybatis-plus是一个mybatis的增强工具,在mybatis的基础上只做增加不做改变,简化开发 提供通用的`mapper和service` 可以在不编写任何SQL语句的情况下快速实现对单表CRUD、批量、逻辑删除、分页操作 Mybatis-plus提供优秀插件,并对idea中快速开发插件mybatisX也进行功能使用。…