四种gc算法按分代思想协同工作:新生代用复制算法高效清理短命对象;老年代用标记-清除实现低开销回收但产生碎片,或用标记-整理消除碎片但需stw;分代收集统筹调度,现代收集器延续其逻辑分代理念。

面试中问到GC算法,核心是讲清楚四种基础策略怎么配合工作,而不是孤立背定义。关键在于理解每种算法解决什么问题、为什么用在特定区域、以及它们之间怎么衔接。
标记-清除:老年代的“轻量回收”
它只做两件事:先遍历所有对象,标记不可达的;再把被标记的内存直接释放。实现简单,不移动对象,所以开销低。但缺点明显——会产生大量内存碎片。CMS收集器就用它,靠并发标记减少停顿,适合对延迟敏感但能容忍碎片的场景。不过一旦碎片太多,触发Full GC时就得切到其他算法处理。
复制算法:新生代的“高效清场”
它不清理,而是把存活对象搬走。Eden + 两块Survivor就是典型实现:每次只用Eden和一块Survivor,GC时把活对象复制到另一块,然后整块清空。没有碎片,分配快,特别适合朝生夕灭的新生代。但代价是空间利用率受限,而且如果一次GC后存活对象太多,Survivor装不下,就会“担保失败”,直接晋升老年代。
标记-整理:老年代的“紧凑回收”
它在标记之后,不是直接删,而是把所有存活对象往一端挪,再清理边界外的内存。这样既回收了空间,又避免碎片。Serial Old、Parallel Old都用它。代价是移动对象要STW,暂停时间比标记-清除长,但换来的是后续分配更稳定,尤其适合大对象频繁分配的阶段。
分代收集:把算法“按需分配”
这不是独立算法,而是组织逻辑。基于“弱代假说”,把堆分成新生代和老年代,再分别配算法:新生代用复制(快+无碎片),老年代用标记-清除或标记-整理(省空间+适配长生命周期)。G1、ZGC等现代收集器虽打破物理分代,但依然保留逻辑分代思想——比如G1的Region里也区分年轻区和老区,回收策略动态匹配。











