# 1. -XX:+PrintCompilation 与 JIT 日志解读 A 编译级别只有 C1 和解释器 B 它只输出 GC 日志 C 它输出 JIT 编译事件的编译时间、级别、状态与方法,可分析编译行为 ✓ 正确答案 D 它无法看到 OSR 标记
# 2. -XX:+UseCompressedOops 对内联缓存的影响 A CompressedOops 压缩 64 位引用为 32 位,减少内存占用与改善局部性,通常对依赖内联缓存的热点有正面影响 ✓ 正确答案 B CompressedOops 会禁用内联缓存 C 压缩指针不影响任何代码生成 D CompressedOops 只影响字符串
# 3. CodeCache 被不同编译代码堆耗尽时有哪些日志与性能征兆,扩容前应先排查哪些根因 A 耗尽时应用性能不受影响 B 只需加大 ReservedCodeCacheSize 即可,无需排查 C CodeCache 耗尽与编译无关 D 耗尽时 JIT 暂停、方法退化为解释执行,扩容前应先排查编译量过大或去优化等根因 ✓ 正确答案
# 4. CompileCommand 与编译指令文件 A 它只能控制 GC B 它无法强制内联 C 编译指令文件只能写一条指令 D 它用于控制 JIT 编译策略(如内联、排除、编译范围),可批量写入文件 ✓ 正确答案
# 5. HotSpot 分层编译如何让 C1 快速编译并由 C2 深度优化,热点计数器和编译阈值在其中承担什么作用 A 分层编译让 C1 快速编译并采集画像,C2 基于画像深度优化,热点计数器与阈值决定升级时机 ✓ 正确答案 B 分层编译只编译一次,无升级 C C1 比 C2 优化更深 D 热点计数器与编译无关
# 6. JEP 483 的 AOT 类加载缓存与运行期 JIT 如何分工,它主要改善启动时间还是稳定运行吞吐,为什么 A 它主要提升稳定运行吞吐 B 它只影响 GC C 它与运行期 JIT 完全重叠 D 它缓存类加载结果以缩短启动时间,与运行期 JIT 分工,主要改善启动而非稳定吞吐 ✓ 正确答案
# 7. JEP 484 Class-File API 为字节码分析和转换提供了什么能力,它与 JIT 编译管线的边界应如何理解 A JEP 484 直接生成机器码 B JEP 484 处理类文件的解析/生成/转换(字节码层面),JIT 负责运行期机器码编译,两者阶段不同、边界清晰 ✓ 正确答案 C JIT 使用 Class-File API 做类文件转换 D 两者完全相同
# 8. JIT 与 Lambda 表达式的协作(LambdaMetafactory) A Lambda 每次都生成匿名内部类 B JIT 无法优化 Lambda C Lambda 由 invokedynamic + LambdaMetafactory 动态生成,JIT 可对其调用点内联优化,接近直接调用 ✓ 正确答案 D LambdaMetafactory 与 invokedynamic 无关
# 9. AOT 编译(Jaotc)与 GraalVM 的差异 A 两者完全相同 B Jaotc 是 HotSpot 内部分方法的 AOT(仍需 JVM),Native Image 是封闭世界全量 AOT 可执行文件(牺牲动态能力) ✓ 正确答案 C Native Image 完全支持所有动态特性 D Jaotc 不需要 JVM
# 10. GraalVM JIT 与 HotSpot C2 在编译速度、峰值性能、内联策略和诊断工具方面有何差异,如何做基准对比 A 两者实现完全相同 B C2 编译速度总比 GraalVM 快 C GraalVM JIT 编译快、部分新特性有优势,C2 成熟稳定,基准对比用 JMH + 真实压测多维度验证 ✓ 正确答案 D 诊断工具两者完全相同
# 11. JIT 基于类型预测做激进优化后,什么情况会触发去优化,去优化如何保证程序语义仍然正确 A 去优化会影响程序语义 B 去优化只在 GC 时发生 C 激进优化永不失效 D 类型画像失效时触发去优化回退解释器,通过守护检查与可恢复栈帧保证语义正确 ✓ 正确答案
# 12. JIT 方法内联需要满足哪些大小、调用类型和类型谱条件,内联失败时应如何从日志确认原因 A 任何方法都能被内联 B 内联需满足大小、调用类型与类型谱条件,可用 PrintInlining 日志确认失败原因 ✓ 正确答案 C 内联失败无需排查 D 内联与类型谱无关
# 13. JIT 编译代码存放在 Code Cache 中时,缓存耗尽会出现哪些现象,应通过哪些参数和日志定位 A CodeCache 无法扩容 B 耗尽不影响性能 C PrintCodeCache 只显示 GC 信息 D 耗尽时编译停止、方法退化解释执行,可用 PrintCodeCache/PrintCompilation 定位并扩容 ✓ 正确答案
# 14. 逃逸分析如何实现标量替换与栈上分配,哪些对象分配能从逃逸分析受益 A 逃逸分析只影响 GC 参数 B 所有对象都能被标量替换 C 不逃逸的对象可被标量替换为字段局部变量,避免堆分配,小且不逃逸的临时对象最受益 ✓ 正确答案 D 逃逸分析会禁止对象创建
# 15. 分层编译中解释器、C1 各级与 C2 如何交换计数和画像,关闭分层编译会失去什么 A 关闭分层会提升性能 B C1 不收集画像 C 分层编译与计数无关 D 解释器计数触发 C1,C1 收集画像供 C2 深度优化,关闭分层会失去快速编译与画像驱动 ✓ 正确答案
# 16. 压缩对象指针如何影响对象布局、缓存占用和 JIT 生成的地址计算,何时应评估关闭它的收益 A 压缩指针只影响 GC B 压缩指针无需解压 C 超过 32GB 压缩指针仍生效 D 压缩指针缩小引用与对象、改善局部性,但访问需解压,堆超大(>32GB)时自动失效,可评估关闭收益 ✓ 正确答案
# 17. 栈上替换 OSR 如何让正在执行的长循环进入编译代码,它与普通方法入口编译有何区别 A OSR 让运行中的长循环切换到编译代码,从循环入口编译,区别于从方法入口的普通编译 ✓ 正确答案 B OSR 只编译方法入口 C OSR 用于 GC D 长循环无法被 OSR 优化
# 18. 热点检测(-XX:CompileThreshold)与分层编译 A CompileThreshold 是触发编译的调用阈值,分层编译下细分为各层级的阈值控制 C1/C2 升级 ✓ 正确答案 B 分层编译与阈值无关 C CompileThreshold 只控制 GC D 分层编译只有一个固定阈值
# 19. 解释器与 JIT 编译器的协作(C1/C2) A 解释器与编译器完全独立 B 解释器计数触发 C1 快速编译并采集画像,画像供 C2 深度优化,去优化回退解释器 ✓ 正确答案 C C1 负责深度优化 D 画像由 C2 采集
# 20. 长循环运行期间发生 OSR 编译时,解释器栈帧如何切换到编译代码,如何用 JFR 或编译日志验证收益 A OSR 从方法入口开始编译 B OSR 把解释器栈帧就地转换为从循环入口开始的编译栈帧,可用 PrintCompilation(% 标记)与 JFR 验证 ✓ 正确答案 C JFR 无法验证 OSR D OSR 无需切换栈帧
# 21. -XX:MaxInlineLevel 与内联深度 A 它只影响字符串常量 B 它控制 GC 线程数 C 内联深度不限 D 它限制内联的最大嵌套深度,属内联预算一部分,防止过度内联导致代码膨胀 ✓ 正确答案
# 22. HotSpot 如何利用接收者类型画像进行推测内联,类层次变化后又为何需要去优化 A 推测内联永不失败 B 图像只用于 GC C 类层次变化不影响内联 D C2 用类型画像推测接收者并内联,插入守护检查,类层次变化破坏假设时触发去优化回退 ✓ 正确答案
# 23. 多态调用点的类型画像被污染后,可能怎样降低内联和分支预测效果,如何通过设计调用点恢复稳定画像 A 画像污染不影响内联 B 接收者类型杂乱会破坏内联与分支预测,通过拆分多态调用点、分流类型可恢复稳定画像 ✓ 正确答案 C 多态调用总能被内联 D 画像污染与 JIT 无关
# 24. C2 对热点循环的优化(循环展开、循环不变量外提)与观察手段 A C2 做循环展开、不变量外提等优化,可用 PrintOptoAssembly/PrintIdeal 观察并 JMH 验证 ✓ 正确答案 B 循环不变量外提会增加循环内计算 C 循环优化无法观察 D C2 不优化循环
# 25. JIT 与 Vector API(JEP 489/508/529)的协作 A C2 把 Vector API 翻译为 SIMD 指令,适配硬件向量能力,不支持时退化为标量 ✓ 正确答案 B Vector API 与 JIT 无关 C Vector API 只能标量执行 D JIT 无法优化 Vector API
# 26. 方法内联失败的常见原因(过大、虚方法) A 只有方法过大一个原因 B 常见原因是方法过大(超大小阈值)与虚方法多态(无法确定目标),可 PrintInlining 查看原因 ✓ 正确答案 C 虚方法总能被内联 D 内联失败无需查看原因
# 27. 方法内联(Method Inlining)的条件与收益 A 内联总会有收益,无风险 B 任何方法都能无条件内联 C 内联消除调用开销并放大后续优化空间,条件是大小、类型与深度在预算内 ✓ 正确答案 D 内联只影响启动
# 28. 方法字节码大小、调用深度和多态程度如何共同影响内联预算,强制内联有什么风险 A 大小、深度、多态共同决定内联预算,强制内联可能造成代码膨胀、编译变慢与性能回退 ✓ 正确答案 B 内联预算只由大小决定 C 强制内联无风险 D 强制内联总是提升性能
# 29. 用 JMH 测量 JIT 优化效果时,为什么必须设置预热、Fork、Blackhole 和参数化场景,才能避免错误结论 A 预热灭 JIT 噪声、Fork 隔离进程、Blackhole 防死代码消除、参数化覆盖输入,缺一不可 ✓ 正确答案 B 预热会让结果更不准 C Blackhole 用于加速 D 无需 Fork 也能复现
# 30. GraalVM Native Image 的封闭世界 AOT 与 HotSpot JIT 在启动、峰值吞吐和动态能力上如何权衡 A Native Image 峰值吞吐高于 JIT B Native Image 完全支持反射 C Native Image 启动快、内存低但牺牲峰值吞吐与动态能力,HotSpot JIT 峰值高、动态性强但启动慢 ✓ 正确答案 D 两者启动速度相同
# 31. Vector API 的显式向量操作与 C2 自动向量化如何取舍,尾部元素和硬件差异怎样处理 A 两者完全相同 B Vector API 显式可控可预测,自动向量化省心但依赖模式识别,尾部用 mask/标量处理,硬件差异由 JIT 自适应 ✓ 正确答案 C Vector API 无法处理尾部元素 D 硬件差异会导致错误结果
# 32. 向量化优化如何识别循环中的连续数据访问,使用 Vector API 时怎样确认生成了 SIMD 指令而非退化标量代码 A 向量化不要求连续访问 B PrintAssembly 只能看标量 C 连续访问、可分析循环、无依赖才可向量化,用 PrintAssembly 查向量指令确认 SIMD 生成 ✓ 正确答案 D 无法确认是否生成 SIMD
# 33. 哪些操作会破坏逃逸分析(反射、同步、identityHashCode、序列化) A 反射、同步、identityHashCode、序列化等依赖对象身份的操作会使逃逸分析视为对象逃逸而放弃优化 ✓ 正确答案 B 反射不影响逃逸分析 C 串行化对象总能被标量替换 D 逃逸分析从不保守