以下是ZGC(Z Garbage Collector)高频面试题10道,涵盖核心原理、特性、适用场景等关键知识点:
-
什么是ZGC?它的主要设计目标是什么?
(考察对ZGC的基本定位理解)
ZGC是Java 11中引入的一款低延迟垃圾收集器(Java 15后成为正式特性),专为大堆、低延迟需求设计。核心目标:停顿时间极短(通常<10ms)、支持TB级堆内存、兼顾吞吐量与扩展性。 -
ZGC支持的最大堆内存是多少?相比G1等传统GC有什么优势?
(考察ZGC对大堆的支持能力)
ZGC理论上支持最大16TB堆内存(实际受操作系统地址空间限制)。相比G1(最大支持数TB,但延迟随堆增大显著上升),ZGC在大堆场景下仍能保持稳定的低延迟,无需频繁调整Region大小。 -
ZGC的典型停顿时间是多少?它如何实现“低延迟”特性?
(考察ZGC低延迟的核心原因)
典型停顿时间通常<10ms,甚至可低至亚毫秒级。核心实现:- 几乎所有阶段(标记、转移、重定位)均为并发执行,仅初始标记和最终标记阶段有极短STW(Stop-The-World);
- 采用“颜色指针”和“读屏障”技术,避免传统GC的“记忆集”或“卡表”开销,减少停顿依赖。
-
ZGC中“颜色指针(Colored Pointers)”的作用是什么?它依赖什么硬件特性?
(考察ZGC的核心技术细节)
颜色指针是ZGC的标志性技术:在对象指针的空闲位(64位系统中未用于寻址的高位)存储标记信息(如“已标记”“待转移”等状态),实现对对象状态的追踪。
依赖64位地址空间(需预留足够空闲位存储状态),32位系统不支持。 -
ZGC的“读屏障(Load Barrier)”与G1的“写屏障”有什么区别?
(考察ZGC与传统GC的技术差异)- ZGC的读屏障:拦截“对象引用读取操作”(如
obj.field),根据指针颜色判断是否需要处理(如转发对象地址),用于并发转移时的指针修正,不阻塞写操作。 - G1的写屏障:拦截“对象引用写入操作”,用于维护记忆集(记录跨Region引用),可能引入额外写延迟。
核心区别:ZGC通过读屏障实现并发安全,对写操作影响更小,更适合低延迟场景。
- ZGC的读屏障:拦截“对象引用读取操作”(如
-
ZGC的垃圾回收过程主要分为哪几个阶段?哪些阶段会STW?
(考察ZGC的工作流程)
主要阶段:- 初始标记(Initial Mark):STW,标记根对象(如线程栈、静态变量),耗时极短;
- 并发标记(Concurrent Mark):并发遍历对象图,标记可达对象;
- 最终标记(Final Mark):STW,处理并发标记遗漏的对象,耗时极短;
- 并发预备转移(Concurrent Prepare for Relocation):准备转移集(需回收的Region);
- 初始转移(Initial Relocate):STW,转移根对象引用的对象;
- 并发转移(Concurrent Relocate):并发转移剩余对象,通过读屏障修正指针;
- 并发清理(Concurrent Cleanup):回收空Region,供下次分配使用。
仅初始标记、最终标记、初始转移为STW阶段,总耗时极短。
-
ZGC是否支持内存压缩?它如何避免“内存碎片”问题?
(考察ZGC的内存管理特性)
ZGC支持内存压缩,且默认开启。它通过“并发转移”阶段将存活对象从旧Region转移到新Region,自动整理内存,避免碎片。相比CMS(不压缩,易产生碎片),ZGC无需频繁Full GC整理内存。 -
ZGC与Shenandoah GC有什么异同?
(考察对同类低延迟GC的理解)
相同点:均为低延迟GC,支持大堆,采用并发标记/转移,依赖读屏障。
不同点:- 颜色指针:ZGC使用颜色指针追踪对象状态,Shenandoah依赖“转发指针”(对象头中存储新地址);
- 屏障开销:ZGC读屏障更轻量,Shenandoah可能因转发指针带来额外开销;
- 兼容性:ZGC最初仅支持Linux,Shenandoah支持更多平台(如Windows、macOS)。
-
ZGC适合什么样的应用场景?不适合哪些场景?
(考察ZGC的适用范围)
适合场景:- 大堆应用(如堆内存>10GB);
- 低延迟需求(如响应时间敏感的服务,如金融交易、实时数据处理);
- 多CPU环境(并发阶段依赖多核提升效率)。
不适合场景: - 小堆应用(堆<1GB,低延迟优势不明显,可能因屏障开销降低吞吐量);
- 32位系统(不支持颜色指针);
- 对吞吐量要求远高于延迟的场景(如离线批处理,G1或Parallel GC可能更优)。
-
如何在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掌握程度的高频考点。