← 每日面试题 学习看板

JVM有哪些垃圾回收算法?

面试题/00java/03JVM/04垃圾回收(GC)基础/JVM有哪些垃圾回收算法?.md

面试记录 2026-09-21

题目:JVM有哪些垃圾回收算法?

难度:medium

标签:jvm/gc, general/knowledge, difficulty/medium

评分:⭐⭐⭐⭐☆(4/5)

我的回答

JVM 的垃圾回收算法核心其实是分代分代思想,然后划分了年轻代、老年代,然后去进行数据的回收、对象的回收、内存的对象的回收。核心其实是这个,然后又是在这个分代思想上建立了不同的分代、不同的处理方式,也就是垃圾回收算法。不同代的垃圾回收算法使用的常规是不太相同的。针对年轻代,朝生夕死这种对象,存活量不多,使用的常见算法是复制、删除或者是复制整理。它把整个对象复制,有还存活的复制到另一个区域,没存活的直接就回收了。然后这是一常规的算法。另外就是复制标记清理,不做整理就直接清理,只标记,然后清理。这时候可能会产生一些内存碎片,这种常用在常规的老年代,因为老年代的对象你不好去对它进行整体的复制,也没有空间去存,相对占用的空间位置较大,没有地方再去存它,存活的时间也比较久的一种对象。再有是后续的多线程的算法,但实际上本质它还是标记清除跟标记整理两个的分类。组成的。然后后续的话,像 G 一里边使用的算法其实是由复制算法演变的,也就是标记整理。它把不同的 Reason 的对象相互复制,然后去清理对应的 Region。大概是这个样子,我理解的垃圾回收算法。

点评

优点:

不足:

补充:

完整讲解

第一部分:知识重点剖析

核心考点定位:考察三大经典 GC 算法的机制与权衡,以及现实 GC 器如何组合演化。

知识点拆解:

  1. 标记-清除(Mark-Sweep)
  1. 复制(Copy)
  1. 标记-整理(Mark-Compact)
  1. GC 器 = 算法组合 + 执行方式
GC 器新生代老年代停顿特征
Serial复制标记-整理单线程,短停顿
ParallelGC(默认 JDK 8)复制并行标记-整理高吞吐,停顿长
CMSParNew(复制)并发标记-清除低延迟但有碎片
G1(JDK 9+ 默认)Region 复制Region 间标记-整理可预测停顿
ZGC / Shenandoah同堆并发标记-整理 + 读屏障<10ms 停顿
  1. 核心权衡三角

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. 为什么新生代用复制不用标记-清除?
  1. Eden:Survivor = 8:1 是什么原理?
  1. 写屏障是什么?为什么并发 GC 必需?
  1. ZGC 如何实现 <10ms 停顿?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,JVM 的经典 GC 算法有三种:标记-清除、复制、标记-整理,然后现实 GC 器都是这三种算法在不同代上的组合。

标记-清除:从 GC Roots 遍历标记存活,再统一清理未标记。实现简单,但有内存碎片问题,长时间运行后大对象可能分配不到连续空间。

复制:堆分两半,GC 时把存活复制到另一半,清空旧半。优点是无碎片、存活少时极快,缺点是浪费一半空间,所以只适合新生代。HotSpot 优化成 Eden:From:To = 8:1:1——Eden 占 80%,两个 Survivor 各 10%,老年代吃满剩余空间;如果 Survivor 装不下就把对象提前晋升。

标记-整理:标记存活后,把存活对象压缩到一侧避免碎片。无碎片但要移动对象,移动时要处理所有引用(写屏障),STW 时间随老年代增长。所以适合老年代。

这三种算法怎么组合成了不同的 GC 器?

总结一句话:新生代选复制(存活少,无碎片),老年代选标记-整理(无碎片,用停顿换空间)。这个选择的基础就是弱分代假说——几乎所有对象朝生夕死。而并发 GC 想进一步缩短停顿,就必须引入写屏障、读屏障、颜色指针这些机制,本质还是这三种算法的演变。