21CTO导读:Java27的新特性,值得开发者一读。
现在 Java 27 已经正式发布,是时候了解一下这个新版本为我们开发人员带来的所有功能了。
继 Java 26 及其 10 个 JEP 之后,Java 27 带来了少量 JEP(9 个),并且几乎没有新增功能。
Java 9 将G1设置为默认垃圾回收器。当时测试表明,对于只有一个 CPU(或更少)且堆内存小于 1792 MB 的环境,串行垃圾回收器效率更高。因此,JVM在这些情况下默认使用串行垃圾回收器。
此后,G1得到了改进,测试表明,对于所有堆大小, G1 的性能现在都与Serial相当。通过改进以减少同步操作(JEP 522),即使在 CPU 数量减少的情况下,G1 的性能也与Serial一样出色。最后, G1 的原生内存消耗也得到了降低,达到了与Serial相当的水平。
从逻辑上讲,由于G1在所有标准上都等于或优于串行,即使在 CPU 和/或 RAM 较少的环境中也是如此,因此它现在是所有环境中的默认设置。
通过为 TLS 1.3 实现混合密钥交换算法,增强需要安全网络通信的 Java 应用程序的安全性。这些算法将抗量子算法与传统算法相结合,有助于抵御未来的量子计算攻击。
混合密钥交换算法将抗量子攻击算法与传统算法相结合,只要其中一种算法未被破解,其安全性就能得到保障。这种方法有助于抵御量子攻击,同时也承认这些新算法尚未受益于传统算法多年来积累的测试和分析经验。
JDK 对 TLS 1.3 的实现将支持三种新的后量子混合密钥交换方案,这些方案将基于模块格的密钥封装机制(ML-KEM - 通过JEP 496添加)与传统的瞬态椭圆曲线 Diffie-Hellman (ECDHE) 算法相结合:
紧凑型对象头允许 JVM 以 64 位而不是 128 位存储对象头:22 位用于类指针,31 位用于哈希码,4 位保留给 Valhalla,其余位与以前一样用于 GC 年龄和 JVM 标志。
紧凑对象头作为 Java 24 中的一种替代对象头结构,通过JEP 450进行了预览,然后在 Java 25 中退出了预览。
从那时起,紧凑对象头就证明了其稳定性和性能。
它们已在 Oracle 使用 JDK 的完整测试套件进行了测试。它们也已在 Amazon 和 SAP 进行了测试,并且这两家公司已默认启用它们。
多项实验表明,启用紧凑型对象头可以提高性能:
Java 27默认启用紧凑型对象头。旧的布局预计将在未来的版本中弃用。
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]"}
以下功能仍处于预览阶段(或孵化器模块中):
isInitialized,并orElse添加工厂方法Set.ofLazy(...)。instanceof:第五次预览,增加了对 `instanceof` 和 `switch` 中原始类型的支持switch,并增强了模式匹配以支持原始类型模式:在 `instanceof` instanceof、` switchcases` 和记录解构中。无其他更改。Joiner:该join()方法接受第三个参数,用于指定StructuredTaskScope可能抛出的异常;awaitAll()已被移除,取而代之的是allSuccessfulOrThrow(),、anySuccessfulOrThrow()和,它们创建连接器,在发生异常时awaitAllSuccessfulOrThrow()会抛出;已被替换为。ExecutionExceptiononTimeout()timeout()PEM(PEM) 格式的支持。新增构造函数,接受 BASE64 编码的字节数组作为类的输入;DEREncodable已重命名为BinaryEncodable;新增EncryptedPrivateKeyInfo.getKeyPair()方法,并新增CryptoException用于指示加密异常的异常。有关这些内容的详细信息,你可以参考21CTO之前的文章。
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);FileOutputStream过去会在打开文件进行写入操作后RandomAccessFile调用系统调用fstat,以拒绝目录。由于相关的打开操作已经失败EISDIR,因此额外的系统调用是多余的;在安全方面,我们可以提到:
jcmd VM.security_properties列出已启用安全属性的新命令( JDK-8364182);此外,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了。
作者:场长
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 微信公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。