JDK 27发布:紧凑对象头、G1默认、量子安全TLS

JDK 27发布:紧凑对象头、G1默认、量子安全TLS

💡 原文中文,约4200字,阅读约需10分钟。
📝

内容提要

JDK 27发布,核心更新为紧凑对象头,将对象头从96位压缩至64位,堆内存最多节省三成;G1成为全域默认回收器,小容器用户需留意GC行为变化;新增量子安全TLS混合密钥交换与JFR自动脱敏,均零代码生效。结构化并发第七次预览、向量API第十二次孵化仍未定稿。升级前建议压测堆内存、GC暂停与吞吐量。

🔎

延伸解读

紧凑对象头:节省效果因应用而异

JDK 27将对象头从96位压缩到64位,但实际节省受8字节对齐规则影响,单个对象可能节省0到4字节。不同应用节省比例差异大:SPECjbb2015测试堆内存减少22%,普通应用约13%,而小型对象密集型应用可达33%。对象越小、数量越多,节省越明显。升级前应针对自身应用压测堆内存变化,不能直接套用基准测试数据。

G1默认回收器:小容器用户需警惕

JDK 27取消自动选择,所有环境默认使用G1,包括1核1.7GB的小容器。此前这类容器可能默认Serial GC,升级后GC行为会改变。G1在极端受限环境下吞吐量可能略低于Serial,延迟虽好但批量任务可能受损。若未显式指定GC,升级前应在容器中用-XX:+UseSerialGC和默认G1分别压测,对比吞吐量、尾延迟、启动时间和RSS内存。

量子安全TLS与JFR脱敏:零代码安全增强

JDK 27为TLS 1.3默认启用X25519MLKEM768混合密钥交换,无需改代码即可抵抗量子计算机的“先存后解”攻击。但混合密钥交换会增加握手数据量,可能轻微增加延迟,尤其在网络条件差时。JFR自动脱敏默认开启,可过滤密码、密钥等敏感信息,支持自定义规则。升级后应测试TLS握手延迟,并了解脱敏配置方式。

预览特性:结构化并发与向量API仍未定稿

结构化并发已第七次预览,异常处理语义收紧,但API未承诺正式定稿。向量API第十二次孵化,仍在等待Project Valhalla的值类型。两者均不适合生产环境,但可在非生产代码中用--enable-preview试用,以提前熟悉新范式。若关注长期稳定,应优先考虑紧凑对象头和G1默认等零代码改动。

Q&A

JDK 27 的紧凑对象头具体是怎么压缩对象头大小的?能节省多少内存?

紧凑对象头将类指针塞进标记字中平时不用的位里,把对象头从 96 位(12 字节)压缩到 64 位(8 字节)。一个 Point 对象从 24 字节变成 16 字节,刚好砍掉三分之一。但受 8 字节对齐规则影响,某些对象实际节省可能只有 0 到 4 字节。在 SPECjbb2015 测试中堆内存减少 22%,普通应用分析任务已用堆内存降幅高达 33%。

JDK 27 把 G1 设为全域默认回收器,小容器用户需要注意什么?

JDK 27 删除了根据 CPU 核心数和内存自动选择 Serial 或 G1 的逻辑,所有环境默认使用 G1。小容器(如 1 核 1.7GB)用户如果从未指定 GC 参数,升级后 GC 行为会悄悄变成 G1,可能导致吞吐量下降。官方建议在容器环境用 -XX:+UseSerialGC 和默认 G1 各跑一轮压测,对比吞吐量、尾延迟、启动时间和 RSS 总内存。

JDK 27 的量子安全 TLS 是如何工作的?需要改代码吗?

JDK 27 的 JEP 527 为 TLS 1.3 增加了混合密钥交换,同时使用传统椭圆曲线(X25519)和抗量子的 ML-KEM 算法。只要应用使用标准 javax.net.ssl API,默认就会启用 X25519MLKEM768,无需改代码。如果对端不支持混合算法,JDK 会同时发送传统和混合密钥共享,让对方选择,不会导致握手失败。但混合密钥交换会略微增加握手延迟。

JFR 自动脱敏功能默认开启吗?如何自定义脱敏规则?

JFR 自动脱敏在 JDK 27 中默认开启,在 JVM 进程内部、数据离开应用前完成脱敏。默认过滤器覆盖 *password*、*api*key*、*secret*、*token*、*credential* 等敏感词,不区分大小写。可以用 -XX:FlightRecorderOptions:redact-key=dburl 添加自定义规则,或用 redact-arguments=@args.txt 从文件加载规则列表。想彻底关闭默认过滤,设置 redact-key=none。

结构化并发和向量 API 在 JDK 27 中是什么状态?

结构化并发在 JDK 27 是第七次预览,从 JDK 19 开始孵化,JDK 21 到 26 完成六轮预览,第七轮收紧了异常处理,但 API 仍未正式定稿。向量 API 是第十二轮孵化,从 JDK 16 开始,还在等待 Project Valhalla 的值类型,因此无法成为正式 API。两者都未定稿。

升级到 JDK 27 前应该做哪些压测和评估?

升级前建议在非生产环境压测,重点看三个数:堆内存使用量、GC 暂停时间和吞吐量。如果应用跑在 1 核小容器且从未指定 GC 参数,需用默认 G1 和 -XX:+UseSerialGC 分别测试,特别关注启动时间和 RSS 内存。若关心安全合规,可验证 JFR 脱敏和量子安全 TLS 的效果,并测试量子安全 TLS 在真实网络下的握手延迟增量。

🏷️

标签

➡️

继续阅读