统计显示:JVM GC是Java实习面试被问概率最高的考点之一,超过70%的技术面会涉及。这篇文章覆盖10道GC高频题+标准答案,背完就能答。
标准答案:堆分为年轻代(Young)和老年代(Old)。年轻代又分Eden区和两个Survivor区(S0/S1),默认比例8:1:1。
年轻代用标记-复制算法——Eden满后触发Minor GC,存活对象复制到Survivor,年龄+1。老年代用标记-清除/标记-整理——空间不足触发Major GC(Full GC)。
加分句: "分代收集的核心假设是'大部分对象朝生夕死'——一次Minor GC后90%以上的对象会被回收。"
标准答案:
Region。维护记忆集(Remembered Set)避免全堆扫描。Mixed GC优先回收垃圾最多的Region——"垃圾优先"。可设置停顿目标(-XX:MaxGCPauseMillis)。加分句: "JDK9起G1成为默认收集器,JDK14移除了CMS。G1解决了CMS的碎片问题,同时提供可预测的停顿时间。"
触发条件(5种):
System.gc()(建议,不一定执行)排查思路:jstat -gcutil 进程ID 1000实时看GC频率→jmap -heap看堆配置→jmap -histo找大对象→MAT分析dump文件。
标准答案:三色标记是CMS/G1等并发收集器用的标记算法,将对象分为:
漏标问题:并发标记时,用户线程可能把一个黑色对象引用的白色对象删除,同时灰色对象又不再引用它→白色对象被"漏掉"。
解决方案:G1用SATB(原始快照)——标记开始时拍快照,删除引用时通过写屏障记录到SATB队列。CMS用增量更新——新增引用时把黑色对象变回灰色重新扫描。
标准答案:ZGC是JDK11引入的低延迟收集器,目标是把STW控制在亚毫秒级(<1ms),支持TB级堆。
核心技术:染色指针(Colored Pointer)——在64位指针中嵌入GC状态信息(marked0/marked1/remapped/finalizable),不需要额外对象头存储。配合读屏障,访问对象时自动修正指针状态。
和G1的区别:G1停顿10-100ms级,ZGC停顿<1ms级。G1有分代(Young/Old),ZGC不分代(JDK21引入分代ZGC)。大堆(>32G)场景ZGC碾压G1。
四条路:①年龄到了(默认15,-XX:MaxTenuringThreshold)②动态年龄判定:Survivor中同龄对象超过50%时,大于该年龄的直接晋升 ③大对象直接分配在老年代(-XX:PretenureSizeThreshold)④Minor GC后Survivor放不下。
STW=Stop The World,暂停所有用户线程。CMS的初始标记和重新标记会STW;G1的初始标记、最终标记、筛选回收会STW;ZGC只有根扫描极短STW(<1ms)。
①栈帧中的局部变量表引用 ②静态变量引用 ③常量池引用 ④JNI引用的对象 ⑤同步锁持有的对象 ⑥Java虚拟机内部的引用(如Class对象、异常对象)。
强引用:new出来的,永不回收。软引用:内存不足时回收,适合做缓存。弱引用:GC时必回收,适合WeakHashMap。虚引用:幽灵引用,唯一作用是对象被回收时收到通知(配合ReferenceQueue)。
小堆(<4G)且低延迟:Serial。吞吐量优先:Parallel Scavenge+Parallel Old。JDK8/11:G1(默认,平衡)。JDK17+超大堆(>32G):ZGC。JDK21+:分代ZGC。
免费工具和文章花了大量时间整理。如果觉得有用,请我喝杯咖啡 ☕
长按识别二维码赞赏 | 更多工具⬇️
📅 更新于2026年5月 · 持续追踪最新面试趋势 · GitHub