Java 22 中的4个永久特性

在这里插入图片描述

功能处于孵化或预览阶段是什么意思?

实际上,这是向 Java 编程语言添加新功能的新过程,Java 社区使用这种过程来在 API 和工具处于早期实验阶段时从社区获得反馈(孵化功能)或已经完全指定但尚未永久的阶段(预览功能)。

预览功能是 Java 语言、Java 虚拟机或 Java SE API 的新功能,已经完全指定和实现,但尚未成为永久性的。它在 JDK 功能发布中提供,以便开发人员根据实际使用情况提供反馈,这可能导致其在未来的 Java SE 平台中成为永久功能。

孵化功能是一个 API 或工具,体量不小,正在开发中,最终将包含在 Java SE 平台或 JDK 中。该 API 或工具尚未完全验证,因此希望推迟标准化或最终确定,以便在少量功能发布中获得更多经验和反馈。

Java 22 新功能

由于 Java 22 不是 LTS 版本,了解哪些功能是非预览(或非孵化)的对想使用最新永久功能的 Java 开发人员来说非常重要。以下是该版本的功能及其状态列表:

  • (✅ 永久) G1 的区域固定
  • (✅ 永久) 外部函数和内存 API
  • (✅ 永久) 未命名变量和模式
  • (✅ 永久) 启动多文件源代码程序
  • (🔍 预览) super(…) 之前的语句
  • (🔍 预览) 类文件 API
  • (🔍 第二次预览) 字符串模板
  • (🔍 预览) 流收集器
  • (🔍 第二次预览) 结构化并发
  • (🔍 第二次预览) 隐式声明类和实例主方法
  • (🔍 第二次预览) 作用域值
  • (🧪 第七次孵化) 向量 API

如上所述,此版本只有 4 个永久性功能,可以预期它们将在下一个 LTS 版本中出现。

1- G1 的区域固定

G1(Garbage First)垃圾收集器自 JDK 9 起成为默认垃圾收集器。这个变化是为了提供更好的整体性能和更可预测的应用程序暂停时间,相较于之前的默认垃圾收集器 Parallel GC。

它首先关注垃圾最多的区域,使用并发和并行处理,并提供更可预测的暂停时间。

通过 JEP 423(G1 的区域固定),Java 22 引入了对 G1 垃圾收集器(GC)的增强。这个新功能旨在显著减少与 Java 本地接口(JNI)关键区域相关的延迟问题。

JNI(Java Native Interface)通过提供获取和释放 Java 对象的直接指针的函数,促进与 C 和 C++ 等非托管编程语言的互操作性。这些函数对内的代码在关键区域内运行,访问 Java 对象的时间被称为关键对象。传统上,G1 会在这些关键区域内禁用 GC,以防止移动对象,从而导致显著的延迟问题,如线程饥饿和应用程序阻塞。

区域固定方法通过将关键对象固定在其位置,确保 GC 能继续进行而不受阻碍,从而解决了这些问题。

总而言之,G1 的区域固定允许垃圾收集器更有效地处理固定对象,提高性能,减少 GC 暂停,并改善 Java 应用程序的内存管理效率。

2- 外部函数和内存 API

经过超过 10 年的工作,通过在 Java 22 中最终确定 JEP 454(外部函数和内存 API),我们现在有了一种比 JNI 更好的方法和 API 来与 Java 运行时之外的代码和数据进行交互。

我认为这是 Java 22 引入的最重要和最革命性的永久功能。该 API 包含两个部分:外部函数 API,它提供了一种高效调用外部函数的方法,以及内存 API,它提供了对外部内存的安全访问,例如 JVM 不管理的内存。

为了更清晰地说明,请看这段来自 bdd 博客的示例代码,展示了如何使用 FFM API 调用外部 C 函数:

void main(String[] args) {// 第一步:查找外部函数Linker linker = Linker.nativeLinker();SymbolLookup stdlib = linker.defaultLookup();MemorySegment strlenAddress = stdlib.find("strlen").orElseThrow();// 第二步:定义输入/输出并创建方法句柄FunctionDescriptor descriptor = FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS);MethodHandle strlen = linker.downcallHandle(strlenAddress, descriptor);// 第三步:管理堆外内存try (Arena offHeap = Arena.ofConfined()) {// 第四步:在堆外内存中使参数 C 兼容MemorySegment funcArg = offHeap.allocateFrom(args[0]);// 第五步:调用函数long len = (long) strlen.invoke(funcArg);}
}

如你所见,FFM 方法比 JNI 方法更易读,后者首先强迫我们使用 native 关键字定义本地方法,然后需要更多步骤来从我们的 Java 代码中调用外部函数。

外部函数和内存 API(FFM)在 Java 中相对于传统的 Java 本地接口(JNI)提供了多项显著优势。它用一种可读的纯 Java API 替代了复杂和脆弱的 JNI 方法,这使得开发人员在处理本地方法时更加轻松。该 API 处理多种内存类型中的结构化和非结构化数据,并通过防止跨线程的使用后释放错误来确保健全性。

3- 未命名变量和模式

未命名变量是 Java 中另一个期待已久的功能。如果你用过 Scala,这个功能你会很熟悉。通过最终确定这个功能,我们现在可以拥有未命名变量和未命名模式,这些可以在需要变量声明或嵌套模式但从未使用时使用。这种变量和模式用下划线字符 _ 表示。

未命名变量
以下几种声明可以引入命名变量或未命名变量:

  • 块中的局部变量声明语句
  • try-with-resources 语句的资源规范
  • 基本 for 循环的头部
  • 增强型 for 循环的头部
  • catch 块的异常参数
  • lambda 表达式的形式参数

当你声明一个未命名变量时,在初始化后你无法访问或修改它。让我们看一些代码示例:

// 带副作用的增强型 for 循环:
static int count(Iterable<Order> orders) {int total = 0;for (Order _ : orders)    // 未命名变量total++;return total;
}// 赋值语句:
Queue<Integer> q = ... // x1, y1, z1, x2, y2, z2, ...
while (q.size() >= 3) {var x = q.remove();var y = q.remove();var _ = q.remove();        // 未命名变量... new Point(x, y) ...
}// catch 块:
String s = ...
try {int i = Integer.parseInt(s);
} catch (NumberFormatException _) {        // 未命名变量System.out.println("Bad number: " + s);
}// 在 try-with-resources 中:
try (var _ = ScopedContext.acquire()) {    // 未命名变量// 不使用获取的资源 ...
}// 参数无关的 lambda:
stream.collect(Collectors.toMap(String::toUpperCase,_ -> "NODATA"))    // 未命名变量

未命名模式变量
未命名模式变量可用于:

在类型模式中(包括 var 类型模式,无论该类型模式出现在顶层还是嵌套在记录模式中)

switch (ball) {case RedBall _   -> process(ball);          // 未命名模式变量case BlueBall _  -> process(ball);          // 未命名模式变量case GreenBall _ -> stopProcessing();       // 未命名模式变量
}switch (box) {case Box(RedBall _)   -> processBox(box);   // 未命case Box(BlueBall _)  -> processBox(box);   // 未命名模式变量case Box(GreenBall _) -> stopProcessing();  // 未命名模式变量case Box(var _)       -> pickAnotherBox();  // 未命名模式变量
}

多模式的 case 标签:

switch (box) {case Box(RedBall _), Box(BlueBall _) -> processBox(box);case Box(GreenBall _)                -> stopProcessing();case Box(var _)                      -> pickAnotherBox();
}

在未命名模式中:

if (r instanceof ColoredPoint(Point(int x, int y), _)) { ... x ... y ... }

欲了解更多描述和示例代码,请访问 官方 JEP 页面。

使用未命名变量和模式的可能问题

使用未命名变量和模式的潜在风险是,从旧版本升级的开发人员如果代码中包含下划线字符 _ 的变量,可能会遇到编译时错误或警告。此外,开发人员可能需要更新静态分析工具,以识别 _ 的新角色,并避免错误地标记其未使用。

4- 启动多文件源代码程序

这个功能是 JShell 的一个补充功能,也是 Java 11 中引入的启动单文件源代码程序功能的补充。

启动多文件源代码程序功能允许开发人员在一次 Java 启动器调用中编译和运行多个 Java 源文件。

这意味着我们现在可以在不手动编译它们的情况下执行跨多个源文件的程序。

这个增强功能简化了从源代码直接运行复杂 Java 应用程序的工作流程,提高了开发效率和便利性。它还将使从小型程序向大型程序的过渡更加渐进,使开发人员能够在项目早期阶段避免配置构建工具。

小结

网上有许多关于 Java 22 新功能的文章,如字符串模板、结构化并发或向量 API,但所有这些有趣和奇妙的功能都处于预览或孵化状态。本文回顾了那些不在预览或孵化状态的功能。对我来说,外部函数和内存 API(FFM)是最令人兴奋和革命性的功能。

你可以在 Oracle 的 官方博客文章 或 OpenJDK 网站上的 JDK 22 官方页面 阅读完整的发布报告和更多信息。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

塔子哥的快乐值-小红书2024笔试(codefun2000)

题目链接 塔子哥的快乐值-小红书2024笔试(codefun2000) 题目内容 塔子哥有许多生活琐事。已知他生活中有n个事件&#xff0c;解决第i个事件需要他花费ti的时间和hi的精力&#xff0c;并能获得ai 的快乐值。 塔子哥想知道&#xff0c;在总花费时间不超过T且总花费精力不超过H的…

操作系统如何高效处理网络请求:IO多路复用技术

在处理大量请求时&#xff0c;各个引擎都会采用线程池的方法&#xff0c;并发处理这些请求&#xff0c;但当一万个请求来的时候&#xff0c;我们要创建一万个线程来处理吗&#xff0c;很显然不会&#xff0c;那假如我创建一千个线程&#xff0c;那一线程该如何处理这个十个请求…

3GPP R18 Multi-USIM是怎么回事?(四)

前几篇主要是MUSIM feature NAS 部分内容的总结,这篇开始看RRC部分相关的内容,由于RRC部分内容过长,也分成了2篇。这篇就着重看下musim gap以及RRC触发UE离开RRC Connected mode相关的内容,直入正题, 上面的内容在overview中有提到,对应的是如下38.300中的描述。 处于网络…

Python -numpy 基础-------1

NumPy&#xff08;Numerical Python&#xff09;是Python的一个开源数值计算扩展库。它支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。NumPy的数组&#xff08;ndarray&#xff09;对象是一个快速且灵活的多维数组对象&#xff0c;用于存储…

黑龙江等保测评最新资讯:强化安全基线,赋能数字未来

在黑龙江省&#xff0c;随着数字化转型的不断深化&#xff0c;企业对其信息安全的关注也越来越高&#xff0c;而作为保护信息资产的一个重要环节的等保测评&#xff0c;也面临着新的机遇和挑战。 最新政策动向 最近&#xff0c;有关部门下发了《关于加强网络安全等级保护的指导…

基于3D开发引擎HOOPS平台的大型三维PLM系统的设计、开发与应用

产品生命周期管理&#xff08;Product Lifecycle Management&#xff0c;PLM&#xff09;系统在现代制造业中扮演着至关重要的角色。随着工业4.0和智能制造的推进&#xff0c;PLM系统从最初的CAD和PDM系统发展到现在的全面集成、协作和智能化的平台。本文将探讨基于HOOPS平台的…

【python】Numpy运行报错分析:IndexError与形状不匹配问题

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

森林防火,森林防火智能储水罐_鼎跃安全

森林防火是保护森林的重要措施&#xff0c;每年发生的森林火灾都严重威胁着自然安全&#xff0c;对社会经济和生态造成严重的破坏。为了切实有效地预防并扑灭森林火灾&#xff0c;森林防火智能储水罐已成为现代森林防火体系中的重要装备。 储水罐内置传感器和控制系统&#xff…

【CTFWP】ctfshow-web32

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 题目介绍&#xff1a;题目分析&#xff1a;payload&#xff1a;payload解释&#xff1a;flag 题目介绍&#xff1a; <?php/* # -*- coding: utf-8 -*- # Autho…

【每日刷题Day85】

【每日刷题Day85】 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; 2. 43. 字符串相乘 - 力扣&#xff08;L…

DC系列靶场---DC 2靶场的渗透测试(二)

漏洞利用及探测 rbash逃逸 虽然我们现在已经可以执行切换路径命令了&#xff0c;但是发现还有是很多命令不能用。 我想看看一下目标主机的所有用户&#xff0c;是不能执行的。 那我们就用到了当前shell逃逸。第一种情况&#xff1a;/ 被允许的情况下&#xff1b;直接 /bin/s…

SpringBoot原理解析(二)- Spring Bean的生命周期以及后处理器和回调接口

SpringBoot原理解析&#xff08;二&#xff09;- Spring Bean的生命周期以及后处理器和回调接口 文章目录 SpringBoot原理解析&#xff08;二&#xff09;- Spring Bean的生命周期以及后处理器和回调接口1.Bean的实例化阶段1.1.Bean 实例化的基本流程1.2.Bean 实例化图例1.3.实…

go 协程池的实现

使用场景 这次需求是做一个临时的数据采集功能&#xff0c;为了将积压的数据快速的消耗完&#xff0c;但是单一的脚本消耗的太慢&#xff0c;于是乎就手写了一个简单的协程池&#xff1a; 为了能加快数据的收集速度为了稳定协程的数量&#xff0c;让脚本变得稳定 设计图如下…

微服务分布式事务

1、分布式事务是什么&#xff1f; 微服务架构中的分布式事务是指在多个服务实例之间保持数据一致性的机制。由于微服务通常涉及将业务逻辑拆分成独立的服务&#xff0c;每个服务可能有自己的数据库&#xff0c;因此当一个业务操作需要跨多个服务进行时&#xff0c;确保所有服务…

sbti科学碳目标倡议是什么

在科学界、工业界以及全球政策制定者的共同努力下&#xff0c;一个名为“科学碳目标倡议”&#xff08;Science Based Targets initiative&#xff0c;简称SBTi&#xff09;的全球性合作平台应运而生。这一倡议旨在推动企业和组织设定符合气候科学要求的减排目标&#xff0c;以…

问题记录-SpringBoot 2.7.2 整合 Swagger 报错

详细报错如下 报错背景&#xff0c;我将springboot从2.3.3升级到了2.7.2&#xff0c;报了下面的错误&#xff1a; org.springframework.context.ApplicationContextException: Failed to start bean documentationPluginsBootstrapper; nested exception is java.lang.NullPo…

信息收集Part3-资产监控

Github监控 便于收集整理最新exp或poc 便于发现相关测试目标的资产 各种子域名查询 DNS,备案&#xff0c;证书 全球节点请求cdn 枚举爆破或解析子域名对应 便于发现管理员相关的注册信息 通过Server酱接口接收漏洞信息 https://sct.ftqq.com/ https://github.com/easych…

2024.7.23(DNS正向解析)

回顾&#xff1a; # 安装 samba yum -y install samba # 自建库&#xff0c;只下载&#xff0c;不安装 yum -y install --downloadonly --downloaddir./soft/ # 配置samba vim /etc/samba/smb.conf # 配置 [xxxxxxxname] commentdasdffsffdslfdjsa path/share …

h5点击电话号跳转手机拨号

需要使用到h5的 <a>标签 我们首先在<head>标签中添加代码 <meta name"format-detection" content"telephoneyes"/>然后再想要的位置添加代码 <a href"tel:10086"> 点击拨打&#xff1a;10086 </a> 这样功能就实现…

系统架构设计师教程 第4章 信息安全技术基础知识-4.3 信息安全系统的组成框架4.4 信息加解密技术-解读

系统架构设计师教程 第4章 信息安全技术基础知识-4.3 信息安全系统的组成框架 4.3 信息安全系统的组成框架4.3.1 技术体系4.3.1.1 基础安全设备4.3.1.2 计算机网络安全4.3.1.3 操作系统安全4.3.1.4 数据库安全4.3.1.5 终端安全设备4.3.2 组织机构体系4.3.3 管理体系4.4 信息加…