17611538698
webmaster@21cto.com

Java 27 来了:都有哪些新特性?

编程语言 0 32 10小时前
图片

21CTO导读:Java27的新特性,值得开发者一读。

现在 Java 27 已经正式发布,是时候了解一下这个新版本为我们开发人员带来的所有功能了。

继 Java 26 及其 10 个 JEP 之后,Java 27 带来了少量 JEP(9 个),并且几乎没有新增功能。

JEP 523:将 G1 设置为所有环境中的默认垃圾回收器


Java 9 将G1设置为默认垃圾回收器。当时测试表明,对于只有一个 CPU(或更少)且堆内存小于 1792 MB 的环境,串行垃圾回收器效率更高。因此,JVM在这些情况下默认使用串行垃圾回收器。

此后,G1得到了改进,测试表明,对于所有堆大小, G1 的性能现在都与Serial相当。通过改进以减少同步操作(JEP 522),即使在 CPU 数量减少的情况下,G1 的性能也与Serial一样出色。最后, G1 的原生内存消耗也得到了降低,达到了与Serial相当的水平。

从逻辑上讲,由于G1在所有标准上都等于或优于串行,即使在 CPU 和/或 RAM 较少的环境中也是如此,因此它现在是所有环境中的默认设置。

JEP 527:TLS 1.3 的后量子混合密钥交换


通过为 TLS 1.3 实现混合密钥交换算法,增强需要安全网络通信的 Java 应用程序的安全性。这些算法将抗量子算法与传统算法相结合,有助于抵御未来的量子计算攻击。

混合密钥交换算法将抗量子攻击算法与传统算法相结合,只要其中一种算法未被破解,其安全性就能得到保障。这种方法有助于抵御量子攻击,同时也承认这些新算法尚未受益于传统算法多年来积累的测试和分析经验。

JDK 对 TLS 1.3 的实现将支持三种新的后量子混合密钥交换方案,这些方案将基于模块格的密钥封装机制(ML-KEM - 通过JEP 496添加)与传统的瞬态椭圆曲线 Diffie-Hellman (ECDHE) 算法相结合:

  • X25519MLKEM768:结合了 ECDHE 与 X25519 和 ML-KEM-768 的混合方案,
  • SecP256r1MLKEM768:结合了使用secp256r1曲线的ECDHE和ML-KEM-768的混合方案,
  • SecP384r1MLKEM1024:结合了使用 secp384r1 曲线的 ECDHE 和 ML-KEM-1024 的混合方案。


JEP 534:默认压缩对象头


紧凑型对象头允许 JVM 以 64 位而不是 128 位存储对象头:22 位用于类指针,31 位用于哈希码,4 位保留给 Valhalla,其余位与以前一样用于 GC 年龄和 JVM 标志。

紧凑对象头作为 Java 24 中的一种替代对象头结构,通过JEP 450进行了预览,然后在 Java 25 中退出了预览。

从那时起,紧凑对象头就证明了其稳定性和性能。

它们已在 Oracle 使用 JDK 的完整测试套件进行了测试。它们也已在 Amazon 和 SAP 进行了测试,并且这两家公司已默认启用它们。

多项实验表明,启用紧凑型对象头可以提高性能:

  • SPECjbb2015 基准测试使用的堆空间减少了 22%,CPU 时间减少了 8%。
  • SPECjbb2015 执行的垃圾回收次数减少了 15%,无论是使用 G1 回收器还是并行回收器。
  • 高度并行化的 JSON 解析器基准测试运行速度提升了 10%。


Java 27默认启用紧凑型对象头。旧的布局预计将在未来的版本中弃用。

JEP 536:JFR 过程中的数据脱敏


JFR 记录文件包含命令行参数、环境变量值和系统属性,这些信息记录了进程的启动和配置方式。因此,这些事件可能包含敏感数据,例如命令行参数、环境变量和系统属性中的机密信息。目前,这些数据直接以原样出现在记录文件中,这在共享记录时会带来敏感信息泄露的风险。

JFR 现在默认会屏蔽多种类型的敏感信息,无需任何额外配置。

您可以使用现有命令行选项的新子选项,显式选择 JFR 应屏蔽的信息-XX:FlightRecorderOptions。每个子选项指定一个或多个过滤器,用于选择要屏蔽的命令行参数、环境变量和系统属性。

该redact-argument子选项指定命令行参数的过滤器列表,该redact-key子选项指定环境变量和系统属性形式的键值对的过滤器列表。

过滤器使用glob 模式,其中 `and`*和`or`?是通配符。如果过滤器匹配到参数或键,则该参数或键值将记录在事件中[REDACTED]。多个过滤器之间用分号分隔,并按指定的顺序进行评估。过滤器的不同子选项之间-XX:FlightRecorderOptions用逗号分隔。

例如,要屏蔽名为“confidential”或“CONFIDENTIAL”的任何环境变量或系统属性,以及任何类似于包含用户名和密码的 URL 的命令行参数(例如,username:password@host),请使用:

java -XX:FlightRecorderOptions:'redact-key=confidential,redact-argument=https://*:*@*' \       -XX:StartFlightRecording:filename=dump.jfr \       -Dconfidential=ANOTHER_SECRET \       -jar application.jar https://john:YET_ANOTHER_SECRET@example.com/login --verbose

要验证敏感信息是否已正确屏蔽,请使用以下jfr print命令:

$ jfr print \      --events InitialSystemProperty,InitialEnvironmentVariable \      dump.jfr[...]jdk.InitialEnvironmentVariable {  startTime = 17:39:02.244 (2026-02-15)  key = "CONFIDENTIAL"  value = "[REDACTED]"}

仍处于预览阶段的功能


以下功能仍处于预览阶段(或孵化器模块中):

  • JEP 531 -惰性常量:第三次预览,一个新的 API,用于创建按需初始化的常量。两项更改:移除底层方法isInitialized,并orElse添加工厂方法Set.ofLazy(...)。
  • JEP 532 - Patterns、instanceof 和 switch 中的原始类型instanceof:第五次预览,增加了对 `instanceof` 和 `switch` 中原始类型的支持switch,并增强了模式匹配以支持原始类型模式:在 `instanceof` instanceof、` switchcases` 和记录解构中。无其他更改。
  • JEP 533 -结构化并发:第七次预览,一个新的 API,允许将多个并发任务视为单个工作单元,从而简化多线程代码的编写。接口有几处更改Joiner:该join()方法接受第三个参数,用于指定StructuredTaskScope可能抛出的异常;awaitAll()已被移除,取而代之的是allSuccessfulOrThrow(),、anySuccessfulOrThrow()和,它们创建连接器,在发生异常时awaitAllSuccessfulOrThrow()会抛出;已被替换为。ExecutionExceptiononTimeout()timeout()
  • JEP 537 - Vector API:第十二个孵化器,一个用于表达向量计算的 API,该 API 可在运行时编译为受支持 CPU 架构的向量指令。无变更。JEP 中已声明,Vector API 将保持孵化状态,直到 Valhalla 项目的功能提供预览版。这符合预期,因为 Vector API 届时将能够利用 Valhalla 项目带来的性能和内存表示方面的改进。
  • JEP 538 -加密对象的 PEM 编码:第三版预览,新增 API,为 Java添加对隐私增强邮件PEM(PEM) 格式的支持。新增构造函数,接受 BASE64 编码的字节数组作为类的输入;DEREncodable已重命名为BinaryEncodable;新增EncryptedPrivateKeyInfo.getKeyPair()方法,并新增CryptoException用于指示加密异常的异常。

有关这些内容的详细信息,你可以参考21CTO之前的文章。

各种各样的JDK 的各种新增功能:


  • Math.acosh(double)和StrictMath.acosh(double):返回一个值的反双曲余弦double。
  • Math.asinh(double)和StrictMath.asinh(double):返回一个值的反双曲正弦值double。
  • Math.atanh(double)和StrictMath.atanh(double):返回一个值的反双曲正切值double。
  • String.encodedLength(Charset)返回使用指定字符集编码的该字符串的长度(以字节为单位)。
  • BigDecimal.rootn(int, MathContext):返回该值的 n 次方根的近似值,根据上下文设置进行四舍五入。
  • DateTimeFormatter现在支持短时区偏移量(+01而不是+01:00),请参阅JDK-8210336。


JDK 27 中的所有新 API 都可以在Java 版本年鉴 - Java 27 中的新 API中找到。

内部变化、性能和安全性


与所有新版本的 Java 一样,OpenJDK 27 包含许多性能优化和安全增强功能。

在性能方面,我注意到两项有意思的改进:

  • HashMap.putAll()Map现在,当是时,有一个快速路径HashMap,它直接调用putHashMapEntries(),从而提高了 66-86%(PR #28243);
  • AVX2 架构新增了一个用于二分查找的内部函数,使得数组大小超过一定阈值( int = 256,long = 768,short = 512,char = 512)时的性能提升了 1.5 倍到 2.35 倍(PR #30612);
  • 打开文件时取消系统调用:在 Unix 系统中,FileOutputStream过去会在打开文件进行写入操作后RandomAccessFile调用系统调用fstat,以拒绝目录。由于相关的打开操作已经失败EISDIR,因此额外的系统调用是多余的;
  • 加密加速:AVX2 上的 AES/ECB、SHA-3、RISK-V 上的 AES/CTR 的新内部函数。


在安全方面,我们可以提到:

  • 添加了 TLS 证书压缩支持(JDK-8372526);
  • 将 WISeKey 证书添加到 JVM 信任库(JDK-8372351);
  • jcmd VM.security_properties列出已启用安全属性的新命令( JDK-8364182);
  • HSS /LMS签名算法现已支持RFC 9858中定义的附加参数集。该 RFC 为使用 SHA-256/192 和基于 SHAKE 的哈希函数(SHAKE256/256 和 SHAKE256/192)的 LMS/HSS 引入了新的参数集。这些新的参数集可以实现更短的签名。


此外,jcmdJVM 的一体化管理命令现在支持 bash 补全(JDK-8357439)。

实验性的 JVM 编译器接口 (JVMCI) 功能已被移除 ( JDK-8382582 )。根据发布说明中所说:

JVMCI 提供了一个实验性的内部 Java API,用于编写可供 Hotspot 调用的 Java JIT 编译器。经过十多年的实验,JDK 内部维护和测试 JVMCI 的成本已经超过了其为数量有限的下游用例带来的收益。

依赖 JVMCI 的下游项目现在必须在自己的开发树中集成和维护 JVMCI,或者继续使用早期版本的 JDK。GraalVM 是这些项目中最为知名的;Graal 编译器的文档中不再提及 JVMCI ,因此不再支持使用 Graal 编译器代替 C2。

结语


总体来讲,Java 27 是一个小型更新版本,没有重大变更或新功能。

好消息是,它的继任者 Java 28 很可能包含 Valhalla 项目的第一阶段,因为JEP 401 - 值对象已经有公开的 PR了。

作者:场长

评论

我要赞赏作者

请扫描二维码,使用微信支付哦。

分享到微信