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 混合密钥交换,默认受益,点到为止 |
准备面试时,少背「特性清单」,多练:变化动机 → 如何确认 → 何时显式覆盖 → 如何用数据说话。这比复述发布会标题更接近真实技术面。