# 1. G1 GC region 设计(默认 2048 个 region)? A G1 每次收集整个堆 B region 大小固定为 2MB不变 C 堆被划分为等大小 region,G1 优先回收垃圾最多的 region 实现增量收集与控制停顿 ✓ 正确答案 D region 不属于任何代
# 2. Shenandoah GC 与 ZGC 在并发压缩上的设计差异? A Shenandoah 用着色指针,ZGC 用转发指针 B 两者都不支持并发移动 C Shenandoah 用转发指针存对象内,ZGC 用着色指针编码在引用中,都靠读屏障并发移动 ✓ 正确答案 D 两者都使用 stop-the-world 压缩
# 3. 为何 ZGC 在 TB 级堆上暂停时间仍 < 1ms? A 因为标记/转移/重映射都并发执行,只保留与堆大小无关的短停顿 ✓ 正确答案 B 因为 ZGC 不移动对象 C 因为堆越大暂停越短 D 因为 ZGC 使用 stop-the-world 全量收集
# 4. write barrier 在并发 GC 中维护三色不变性的角色? A 写屏障在引用被写入时记录旧/新引用,防止并发标记漏标存活对象 ✓ 正确答案 B 写屏障只用于单线程 GC C 三色标记不需要屏障 D 写屏障会降低 GC 正确性
# 5. Go 三色标记(tri-color marking)算法? A Go 是引用计数 GC B Go GC 会移动对象并压缩堆 C 三色标记不需要写屏障 D 对象分白/灰/黑,从根标灰并传播,白对象为垃圾被清扫,用写屏障支持并发 ✓ 正确答案
# 6. HotSpot 中 card table 在 minor GC 跨代引用扫描中的作用? A card table 是精确到对象粒度的 B card table 用于压缩年轻代 C minor GC 需要扫描整个老年代 D card table 记录老年代哪些卡含指向年轻代的引用,minor GC 只扫描 dirty 卡,加速根扫描 ✓ 正确答案
# 7. GC roots 包含哪些对象?安全点(safepoint)如何让所有线程在可枚举根的位置停顿,JIT 编译与内联如何配合? A JIT 内联不需要 oop map B GC roots 只包含堆对象 C 线程可以随时停顿,无需安全点 D GC roots 含栈/寄存器/JNI/静态引用等,线程在安全点停顿,JIT 生成 oop map 让 GC 精确枚举栈根 ✓ 正确答案
# 8. ZGC 的 colored pointers 与并发标记? A 指针高位编码对象状态,读屏障按颜色决策实现并发标记与重定位 ✓ 正确答案 B 着色指针会增加堆大小上限 C ZGC 需要 STW 整理 D 着色指针与读屏障无关
# 9. generational hypothesis(分代假说)与 minor/major GC 关系? A minor GC 回收整个堆 B 所有对象都存活很久 C 多数对象短命,年轻代用高频 minor GC 回收,存活对象晋升老年代用低频 major GC ✓ 正确答案 D 分代假说与 GC 设计无关
# 10. mark-sweep、mark-compact、copying 三种 GC 算法的差异? A mark-compact 产生最多碎片 B 三种算法都移动对象 C copying 是唯一无碎片的算法 D mark-sweep 快但碎片多,mark-compact 无碎片但需移动,copying 高效但浪费一半空间 ✓ 正确答案
# 11. 为何 Java HotSpot 把堆划分为 young/old 区域? A 依据分代假说,年轻代高频 minor GC 回收短命对象,老年代低频 major GC ✓ 正确答案 B 划分代是为了让 GC 扫描整个堆 C 年轻代和老年代对象存活时间相同 D 划分代不会降低停顿
# 12. CMS(Concurrent Mark Sweep)为何被 G1 取代? A G1 不控制停顿 B CMS 比 G1 停顿更短且更稳定 C CMS 不整理产生碎片、停顿不可预测,G1 用 region 增量收集提供可预测停顿 ✓ 正确答案 D CMS 是 G1 的改进版
# 13. GC 的标记-清除/复制/标记-整理,三种算法如何对比? A 三种算法都浪费一半空间 B 复制无碎片但浪费空间,标记-整理无碎片但需移动,标记-清除快但碎片多 ✓ 正确答案 C 复制算法碎片最多 D 标记-整理不需要移动对象
# 14. G1 的 SATB(Snapshot-At-The-Beginning)与 RSet(Remembered Set)分别解决什么问题,跨 region 引用如何被记录? A SATB 通过快照防止并发标记漏标,RSet 记录跨 region 引用使增量收集高效 ✓ 正确答案 B SATB 用于记录跨 region 引用 C RSet 用于保证并发标记正确性 D 两者都不需要写屏障
# 15. 引用计数(如 Swift ARC、C++ shared_ptr)与追踪式 GC(Java/Go)在循环引用、停顿时间与吞吐上的本质差异? A 两者都能根除循环引用 B 引用计数能自动处理循环引用 C 追踪式 GC 释放更即时 D 引用计数即时释放、难处理循环引用;追踪式 GC 延迟回收、能自动处理循环引用 ✓ 正确答案
# 16. Go GC 如何在并发下避免悬空指针? A Go 用引用计数避免悬空 B 通过写屏障维护三色不变性,保证可达对象不被回收,从根可达性判断避免悬空 ✓ 正确答案 C Go 并发标记可能漏标存活对象 D Go 需要手动释放内存
# 17. 分代 GC 与三色标记,为什么新生代用复制、老年代用标记整理? A 新生代用标记整理,老年代用复制 B 新生代存活率低,复制高效无碎片;老年代存活率高,标记整理省空间少移动 ✓ 正确答案 C 两种算法都浪费一半空间 D 算法选择与存活率无关
# 18. GC 的停顿,并发标记与读写屏障如何配合? A 并发标记用读写屏障保证并发安全,从而减少停顿,只保留必要的短停顿 ✓ 正确答案 B 读写屏障会增加停顿 C 并发标记必须 STW D 读写屏障与标记无关