Java 面试题

JVM垃圾回收机制详解:GC算法与调优

"请你讲一下JVM的垃圾回收机制。"

为什么面试官会问这道题

这是Java面试中仅次于HashMap的高频考点。字节跳动、阿里巴巴、美团等大厂都会深入考察GC机制,因为它直接关系到线上服务的性能和稳定性。能讲清楚GC原理和调优经验,是Senior Java工程师的基本功。

如何回答

  1. 1

    先讲分代模型:JVM堆分为新生代(Eden区 + 两个Survivor区)和老年代,基于"大部分对象朝生夕死"的假说。

  2. 2

    解释Minor GC:新对象在Eden区分配,Eden满了触发Minor GC,采用复制算法将存活对象复制到Survivor区。经过多次GC仍存活的对象(默认15次)晋升到老年代。

  3. 3

    讲清Major/Full GC:老年代空间不足时触发,STW时间长,对应用影响大。

  4. 4

    介绍GC算法:标记-清除(产生碎片)、标记-整理(移动对象消除碎片)、复制算法(新生代使用,空间换时间)。

  5. 5

    重点讲常用收集器:CMS(低延迟但已废弃)、G1(Java 9默认,Region化设计,可预测停顿)、ZGC(亚毫秒停顿,适合大堆)。

参考回答示例

JVM垃圾回收基于可达性分析算法,从GC Roots(虚拟机栈引用、静态变量、JNI引用等)出发,不可达的对象即为垃圾。堆内存采用分代设计:新生代包含Eden和两个Survivor区,默认比例8:1:1。新对象在Eden分配,Eden满了触发Minor GC,使用复制算法将存活对象复制到Survivor区,两个Survivor区交替使用。对象每经历一次GC,年龄加1,达到阈值(默认15,CMS默认6)后晋升到老年代。老年代空间不足时触发Full GC,STW时间较长。GC算法方面:标记-清除算法分两步走但产生内存碎片;标记-整理算法在标记后将存活对象向一端移动,消除碎片但开销大;复制算法将内存一分为二,高效但浪费空间。G1收集器是目前主流选择,它将堆划分为大小相等的Region,既可以收集新生代也可以收集老年代,通过维护一个优先级队列来优先回收价值最大的Region,实现可预测的停顿时间。线上调优方面,关键参数包括-Xms/-Xmx设置堆大小、-XX:MaxGCPauseMillis设置G1目标停顿时间,出现频繁Full GC要分析是内存泄漏还是堆空间不足,可以通过jstat监控GC频率,jmap导出堆转储用MAT分析。

实用技巧

  • 一定要理清Minor GC、Major GC、Full GC的区别,面试官经常追问。

  • 讲清楚GC Roots有哪些——这是可达性分析的起点,很多人容易遗漏。

  • 如果有线上GC调优经验一定要分享,这是加分项,能区分背八股文和真正有实战能力的候选人。

  • 面试中如果忘了某个收集器的特点,即答侠可以实时提供关键信息。

常见问题

什么情况下会触发Full GC?

老年代空间不足、方法区(元空间)不足、调用System.gc()、CMS GC失败(Concurrent Mode Failure)等都可能触发Full GC。

G1和CMS的主要区别是什么?

CMS使用标记-清除算法,会产生碎片,已在Java 14废弃。G1使用Region化设计+标记-整理,可以设置期望停顿时间,是目前推荐的默认收集器。

线上频繁Full GC怎么排查?

先用jstat看GC频率和各区占用,再用jmap dump堆内存,用MAT或VisualVM分析大对象和内存泄漏。常见原因是大对象直接进入老年代、内存泄漏、堆空间设置过小。

面试时担心忘词?即答侠实时助你

即答侠 AI 实时监听面试对话,自动识别问题并即时生成回答建议——无感辅助,让你从容应对每一道题。

免费试用即答侠