Java 27 已于 2026 年 9 月 15 日正式发布。对多数团队来说,生产仍以 Java 21 / 25(LTS)为主;但面试官越来越爱用「新版本默认行为变了什么」来区分「背过八股」和「真跟过运行时」。
本文按 考什么 → 怎么答 → 追问陷阱 整理 7 个高频点,聚焦三件事:G1 全面默认(JEP 523)、Compact Object Headers 默认开启(JEP 534)、结构化并发第七预览(JEP 533)。文末顺带提 TLS 1.3 的后量子混合密钥交换(JEP 527),不堆新闻。
参考:Inside.java JDK 27 发布说明、InfoWorld JDK 27 特性综述、以及对应 JEP。
1. 先对齐版本定位:Java 27 在面试里考什么
考什么 你能不能说清:27 是短期支持版本、和 LTS 怎么选、这次「默认行为」和「Preview API」分别意味着什么。
怎么答 - Java 27 是非 LTS,功能集不大(约 9 个
JEP),但有两处 开箱默认行为 变化:G1
在所有环境下成为默认收集器;Compact Object Headers 默认开启。 - Preview
/ Incubator(如结构化并发、部分模式匹配、Vector API)需要
--enable-preview(或对应模块),不能当成生产默认能力对外拍胸脯。
- 业务选型:要长期维护选 LTS;要体验默认行为与安全增强,可在预发 /
压测环境先跑 27,用数据决定是否跟进。
追问陷阱 - 「27 比 25 更快吗?」没有统一答案。默认头布局和 GC 选择会改变 footprint 与 GC 压力,必须以你的堆对象分布和延迟目标实测。 - 「公司还在 17/21,还要看 27?」要。面试官考的是你是否理解 默认策略为何变,以及升级时你会验证什么,而不是让你立刻上生产。
2. G1 全面默认(JEP 523)
考什么 以前「小机器 / 单核 / 内存很紧」时,JVM 可能默默选 Serial;27 起,不显式指定收集器时一律默认 G1。你是否知道变化动机,以及如何显式回退。
怎么答 - 从 JDK 9 起,服务器类环境默认就是
G1;受限环境仍可能落到 Serial。 - JEP 523 的目标:未指定 GC 时,HotSpot
始终选 G1;吞吐、延迟、内存、启动时间相对旧默认
不应明显退化。 - 动机简述:G1 经多轮改进后,在以往会选
Serial 的场景里也已足够可用;统一默认还能避免容器里「以为自己在用
G1、实际是 Serial」的认知偏差。 - 需要 Serial / Parallel / ZGC
等时,仍用显式参数覆盖,例如 -XX:+UseSerialGC。
追问陷阱 - 「所以 Serial 被删了?」没有。只是 默认选择 变了,显式指定仍然可用。 - 「1 CPU、256MB 的容器也一定用 G1 更好?」JEP 也提醒:没有绝对最优 GC,极端受限场景仍可能更适合 Serial,要测。 - 「和 ZGC / Shenandoah 怎么比?」回答维度应是:延迟目标、堆大小、CPU 预算、是否需要特定调优经验;不要背「谁最好」。
加分一句 升级到 27 后,用 -Xlog:gc* 或
JFR 确认实际收集器,并对比升级前后的 pause / 吞吐 / 原生内存。
3. Compact Object Headers 默认开启(JEP 534)
考什么 对象头从约 96 bit 收到 64 bit(64 位架构)意味着什么;从何时可试用;如何关闭;对堆和 GC 的间接影响。
怎么答 - Compact Object
Headers:压缩对象头布局,典型效果是 堆占用下降、局部性变好、GC
压力减轻。公开材料里常见量级是「不少负载可到约 10%~20%
堆节省」(具体看对象大小分布,小对象多更明显)。 - 演进:JDK 24
引入(JEP 450)→ JDK 25 成为正式产品特性(JEP 519,需
-XX:+UseCompactObjectHeaders)→ JDK 27
默认开启(JEP 534)。 -
临时关闭:-XX:-UseCompactObjectHeaders(旧布局计划在未来版本弃用/移除,不要当作长期方案)。
- CDS:默认开启后,镜像侧也提供对应 compact header 的 CDS
archive;关掉特性时用另一套 archive。
追问陷阱 - 「所有对象都少 4 字节,所以一定快 20%?」堆变小不等于吞吐线性提升;要看缓存命中、GC 次数、分配速率。 - 「和压缩指针(CompressedOops)是一回事吗?」不是。CompressedOops 管的是 堆内引用宽度;Compact Object Headers 管的是 对象头布局。可以并存,别混谈。 - 「原生内存 / 堆外会一起降吗?」主要收益在 Java 堆对象元数据;堆外、元空间、线程栈要另说。
4. 连带考点:G1 堆伸缩默认也变了
考什么 升级 27 后,有人发现「Full GC /
System.gc() 后堆大小行为不像以前」。这和 G1 默认 ratio
调整有关。
怎么答 - Release Notes:G1 下
-XX:MinHeapFreeRatio / -XX:MaxHeapFreeRatio
默认从 40/70 调整为 0/100,等于
默认不再靠这两项做堆伸缩。 - 若应用曾依赖旧默认在 Full
GC
后收缩/扩张堆,升级后行为会变;显式设置过这两个参数的,仍按你的设置走。
- 另:-XX:InitiatingHeapOccupancyPercent 重命名为
-XX:G1IHOP(知其新旧名即可)。
追问陷阱 - 把「堆不缩」全部归罪于 Compact Object
Headers。答偏了。先查 GC 日志和是否仍依赖 System.gc() / 旧
ratio 语义。
5. 结构化并发第七预览(JEP 533)
考什么 你是否理解结构化并发要解决的问题(任务生命周期、取消、线程泄漏),以及 JDK 27 这一轮 异常模型 的变化。
怎么答(概念) -
虚拟线程解决「线程太贵」;结构化并发解决「一组相关任务如何作为
单一工作单元 启动、汇合、失败、取消」。 - 核心
API:StructuredTaskScope + Joiner 策略(如
all-or-nothing、任一成功等),用 try-with-resources
约束子任务寿命,降低线程泄漏和取消滞后。 - JDK 27 仍是
Preview,需预览开关;面试里要主动声明「预览、API
仍可能微调」。
怎么答(27 的关键变化) - 标准
Joiner(allSuccessfulOrThrow /
anySuccessfulOrThrow /
awaitAllSuccessfulOrThrow)在子任务失败时,join()
改为抛 ExecutionException(与
Future.get() 同族),不再用预览专用的
FailedException。 - StructuredTaskScope /
Joiner 增加第三类型参数,表达 join()
可能抛出的异常类型;普通 open() 用法大多可被编译器推断。 -
配置向:新增
open(UnaryOperator),便于在默认策略下设置名称、超时、线程工厂等。
追问陷阱 -
「结构化并发能替代线程池吗?」不对等。它管的是
任务结构与生命周期;执行载体仍可以是虚拟线程等。 - 「和
CompletableFuture.allOf
有何不同?」可强调:作用域结束时子任务应结束;失败/取消策略更统一;可观测性按「一个单元」来看。不要贬低
CF,说清问题域。 - 背过时 API:若仍答
FailedException,面试官会认为你停在旧预览文章。以
JEP 533 为准。
6. 虚拟线程 × 结构化并发:组合题怎么答
考什么 Spring / 微服务场景里,阻塞 I/O 多、扇出调用多。你会不会把「便宜的线程」和「正确的并发结构」分开讲。
怎么答 -
虚拟线程:适合大量阻塞式任务,降低平台线程占用。 -
结构化并发:适合「一次请求扇出多个下游、要统一超时/取消/错误」。 -
典型表述:父任务打开 scope → fork 多个子任务 → join 汇合 →
scope 关闭时子任务不应泄漏。 - 和 Spring
的关系:点到「业务代码里的扇出编排」即可,不必展开 Web
框架内部调度(深度框架题交给 Spring 专题)。
追问陷阱 - 「开了虚拟线程就不用管取消了?」恰恰相反,线程更便宜后,泄漏和失控扇出更常见,更需要结构化边界。
7. 安全向加分:PQC Hybrid TLS(JEP 527)
考什么 安全向面试官可能随口问:Java 27 在 TLS 上做了什么「默认更安全」的事。
怎么答 - JEP 527:为 TLS 1.3 提供
后量子混合密钥交换(经典 ECDHE + 抗量子 ML-KEM)。 -
默认会优先提供如 X25519MLKEM768 这类混合组;使用标准
javax.net.ssl、且未锁死 named groups
的应用,通常无需改代码 即可在对端支持时受益。 - 可用
jdk.tls.namedGroups 或
SSLParameters.setNamedGroups 调整。
追问陷阱 - 把整篇答成密码学综述。面试场景够用「混合 = 两边都要破才危」「默认开启、可配」即可。 - 「没有量子计算机就没用?」关注点是 harvest now, decrypt later:今天截获、未来再解。
面试收尾:你可以主动补的三句话
- 默认变了什么:G1 全环境默认;Compact Object Headers 默认开;TLS 混合密钥交换默认更抗量子。
- 什么仍是预览:结构化并发等 Preview,生产要谨慎,面试讲清启用方式与异常模型即可。
- 我会怎么验证:对照 GC 日志 / 堆占用 / 延迟 SLO;容器小规格单独回归;有自定义 TLS named groups 的要复查握手。
速查表
| 主题 | JEP | 面试答法 |
|---|---|---|
| G1 全面默认 | 523 | 不指定 GC 时一律 G1,小规格也不再默默落 Serial |
| Compact Object Headers | 534 | 64 位上头从 ~96bit→64bit,默认开,可
-XX:-UseCompactObjectHeaders 临时关 |
| 结构化并发 | 533 | 第七预览;标准 Joiner 失败时 join 抛
ExecutionException |
| PQC Hybrid TLS | 527 | TLS 1.3 混合密钥交换,默认受益 |
准备面试时,少背「特性清单」,多练:变化动机 → 如何确认 → 何时显式覆盖 → 如何用数据说话。这比复述发布会标题更接近真实技术面。
一起交流
分享你的思考,让讨论更进一步。