在 JVM 内存管理中,GC(垃圾回收)是绕不开的核心话题,而新手常被'收集器、GC 类型、底层算法'三者的关系绕晕——到底 Serial GC 和 Minor GC 是什么关系?标记 - 清除算法又被哪些收集器使用?本文将打破概念壁垒,从本质到落地,系统梳理三者的关联,帮你建立完整的 GC 知识体系。
一、先明确三大核心概念的本质
这三者并非并列关系,而是'底层实现(算法)→ 操作类型(GC 类型)→ 具体载体(收集器)'的层层递进关系,我们先逐个拆解本质:
1. 底层垃圾回收算法(执行手段)
是 GC 的'底层操作逻辑',定义了'如何识别垃圾'和'如何回收垃圾',是所有收集器的实现基础。核心有 4 类(含优化变种),各有适配场景:
- 标记 - 清除算法:先标记不可达的垃圾对象,再直接清除。优点是实现简单、无需移动对象;缺点是产生内存碎片、回收效率低(适合存活对象多的场景)。
- 标记 - 复制算法:将内存划分为两块,仅使用一块,回收时复制存活对象到另一块,再清空原块。优点是无碎片、回收效率高;缺点是内存利用率低(仅 50%,适合存活对象少的场景)。
- 标记 - 整理算法:先标记垃圾对象,再将存活对象向内存一端移动,最后清空末端垃圾。优点是无碎片、内存利用率高;缺点是移动对象开销大,STW(停止-the-世界)时间长(适合碎片敏感场景)。
- 标记 - 重定位算法:标记 - 复制的优化版,通过'染色指针'并发移动对象,无需全程 STW,兼顾无碎片和低停顿(现代大内存 GC 的核心算法)。
2. GC 类型(按回收区域划分的操作)
是对'GC 操作范围'的分类,和具体收集器无关,所有收集器都需执行对应类型的 GC,核心分 3 类(JVM 规范无严格定义,以实际回收区域为准):
- Minor GC(新生代 GC):仅回收新生代(Eden+Survivor 区),触发条件为 Eden 区满,所有收集器均支持,STW 时间较短(新生代对象朝生夕死,存活少)。
- Major GC(老年代 GC):仅回收老年代,极少单独触发,通常与 Full GC 混淆,触发条件多为老年代使用率达阈值、晋升失败。
- Full GC(全堆 GC):回收新生代 + 老年代 + 元空间,触发条件复杂(老年代满、显式调用 System.gc()、碎片过多等),STW 时间最长,需尽量避免。
3. GC 收集器(算法与 GC 类型的载体)
是 JVM 提供的


