10 道 ZGC 高频面试题(含核心原理与实践考点)

76 阅读5分钟

以下是ZGC(Z Garbage Collector)高频面试题10道,涵盖核心原理、特性、适用场景等关键知识点:

  1. 什么是ZGC?它的主要设计目标是什么?
    (考察对ZGC的基本定位理解)
    ZGC是Java 11中引入的一款低延迟垃圾收集器(Java 15后成为正式特性),专为大堆、低延迟需求设计。核心目标:停顿时间极短(通常<10ms)、支持TB级堆内存、兼顾吞吐量与扩展性。

  2. ZGC支持的最大堆内存是多少?相比G1等传统GC有什么优势?
    (考察ZGC对大堆的支持能力)
    ZGC理论上支持最大16TB堆内存(实际受操作系统地址空间限制)。相比G1(最大支持数TB,但延迟随堆增大显著上升),ZGC在大堆场景下仍能保持稳定的低延迟,无需频繁调整Region大小。

  3. ZGC的典型停顿时间是多少?它如何实现“低延迟”特性?
    (考察ZGC低延迟的核心原因)
    典型停顿时间通常<10ms,甚至可低至亚毫秒级。核心实现:

    • 几乎所有阶段(标记、转移、重定位)均为并发执行,仅初始标记和最终标记阶段有极短STW(Stop-The-World);
    • 采用“颜色指针”和“读屏障”技术,避免传统GC的“记忆集”或“卡表”开销,减少停顿依赖。
  4. ZGC中“颜色指针(Colored Pointers)”的作用是什么?它依赖什么硬件特性?
    (考察ZGC的核心技术细节)
    颜色指针是ZGC的标志性技术:在对象指针的空闲位(64位系统中未用于寻址的高位)存储标记信息(如“已标记”“待转移”等状态),实现对对象状态的追踪。
    依赖64位地址空间(需预留足够空闲位存储状态),32位系统不支持。

  5. ZGC的“读屏障(Load Barrier)”与G1的“写屏障”有什么区别?
    (考察ZGC与传统GC的技术差异)

    • ZGC的读屏障:拦截“对象引用读取操作”(如obj.field),根据指针颜色判断是否需要处理(如转发对象地址),用于并发转移时的指针修正,不阻塞写操作
    • G1的写屏障:拦截“对象引用写入操作”,用于维护记忆集(记录跨Region引用),可能引入额外写延迟。
      核心区别:ZGC通过读屏障实现并发安全,对写操作影响更小,更适合低延迟场景。
  6. ZGC的垃圾回收过程主要分为哪几个阶段?哪些阶段会STW?
    (考察ZGC的工作流程)
    主要阶段:

    1. 初始标记(Initial Mark):STW,标记根对象(如线程栈、静态变量),耗时极短;
    2. 并发标记(Concurrent Mark):并发遍历对象图,标记可达对象;
    3. 最终标记(Final Mark):STW,处理并发标记遗漏的对象,耗时极短;
    4. 并发预备转移(Concurrent Prepare for Relocation):准备转移集(需回收的Region);
    5. 初始转移(Initial Relocate):STW,转移根对象引用的对象;
    6. 并发转移(Concurrent Relocate):并发转移剩余对象,通过读屏障修正指针;
    7. 并发清理(Concurrent Cleanup):回收空Region,供下次分配使用。
      初始标记、最终标记、初始转移为STW阶段,总耗时极短。
  7. ZGC是否支持内存压缩?它如何避免“内存碎片”问题?
    (考察ZGC的内存管理特性)
    ZGC支持内存压缩,且默认开启。它通过“并发转移”阶段将存活对象从旧Region转移到新Region,自动整理内存,避免碎片。相比CMS(不压缩,易产生碎片),ZGC无需频繁Full GC整理内存。

  8. ZGC与Shenandoah GC有什么异同?
    (考察对同类低延迟GC的理解)
    相同点:均为低延迟GC,支持大堆,采用并发标记/转移,依赖读屏障。
    不同点:

    • 颜色指针:ZGC使用颜色指针追踪对象状态,Shenandoah依赖“转发指针”(对象头中存储新地址);
    • 屏障开销:ZGC读屏障更轻量,Shenandoah可能因转发指针带来额外开销;
    • 兼容性:ZGC最初仅支持Linux,Shenandoah支持更多平台(如Windows、macOS)。
  9. ZGC适合什么样的应用场景?不适合哪些场景?
    (考察ZGC的适用范围)
    适合场景:

    • 大堆应用(如堆内存>10GB);
    • 低延迟需求(如响应时间敏感的服务,如金融交易、实时数据处理);
    • 多CPU环境(并发阶段依赖多核提升效率)。
      不适合场景:
    • 小堆应用(堆<1GB,低延迟优势不明显,可能因屏障开销降低吞吐量);
    • 32位系统(不支持颜色指针);
    • 对吞吐量要求远高于延迟的场景(如离线批处理,G1或Parallel GC可能更优)。
  10. 如何在JVM中启用ZGC?常用的调优参数有哪些?
    (考察ZGC的实际使用)
    启用方式(Java 11+):

    java -XX:+UseZGC -Xmx16g ...  # 启用ZGC,设置最大堆为16GB
    

    常用调优参数:

    • -XX:ZHeapSize=<min,max>:指定ZGC堆的最小/最大值(替代-Xms/-Xmx);
    • -XX:ZCollectionInterval=<sec>:设置两次GC的最小间隔(默认0,即按需触发);
    • -XX:ZMaxHeapSizePercent=<n>:堆占物理内存的最大比例(默认90%)。

这些问题覆盖了ZGC的核心原理、技术细节、适用场景及实践调优,是面试中考察ZGC掌握程度的高频考点。