hello
发布于 2026-09-29 / 1 阅读
0
0

Java 27 面试怎么答:G1 全面默认、Compact Object Headers、结构化并发

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:今天截获、未来再解。

面试收尾:你可以主动补的三句话

  1. 默认变了什么:G1 全环境默认;Compact Object Headers 默认开;TLS 混合密钥交换默认更抗量子。
  2. 什么仍是预览:结构化并发等 Preview,生产要谨慎,面试讲清启用方式与异常模型即可。
  3. 我会怎么验证:对照 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 混合密钥交换,默认受益,点到为止

准备面试时,少背「特性清单」,多练:变化动机 → 如何确认 → 何时显式覆盖 → 如何用数据说话。这比复述发布会标题更接近真实技术面。


评论