1255 字
6 分钟
Minor GC、Major GC、Full GC 的区别

面试题:Minor GC、Major GC、Full GC 有什么区别?

这几个名称用于描述不同范围或类型的垃圾回收。

名称通常回收的范围重点
Minor GC新生代通常比较频繁
Young GC新生代通常与 Minor GC 同义
Major GC传统分代语境下通常指老年代具体定义因实现而异
Full GC通常涉及整个堆,可能包含其他相关内存区域的处理范围较广,需要关注开销和停顿

注意:不同 JVM 实现和垃圾收集器的术语并不完全统一,不能简单认为 Major GC 一定等于 Full GC。

Minor GC / Young GC#

基本概念#

Minor GC 通常指新生代垃圾回收,也常称为 Young GC。

在传统分代模型中,新对象通常先在 Eden 区分配。随着对象不断创建,新生代空间逐渐被占用,JVM 就可能触发 Young GC。

回收过程#

新对象不断创建
|
v
Eden 区
|
v
Young GC
|
+------> 不可达对象:回收
|
+------> 存活对象:保留或转移
|
v
Survivor 区
|
v
满足条件后晋升
|
v
老年代

特点#

  • 主要回收新生代。
  • 通常发生得比较频繁。
  • 在传统分代收集器中,存活对象可能被复制到 Survivor 区,或者晋升到老年代。

Major GC#

基本概念#

在传统分代语境下,Major GC 通常指老年代垃圾回收。

老年代存放的是存活时间较长、达到晋升条件的对象。这些对象也可能因为缓存清理、业务数据替换等原因失去引用,成为垃圾。

特点#

  • 通常与老年代回收有关。
  • 具体回收方式取决于垃圾收集器。
  • 回收开销和停顿时间取决于对象数量、存活比例、收集器及其运行状态。

注意:Major GC 的定义并非所有 JVM 实现都一致,面试时不应把它与 Full GC 直接画等号。

Full GC#

基本概念#

Full GC 通常表示范围较广的垃圾回收。

在常见的 HotSpot JVM 语境中,Full GC 通常涉及整个堆的回收,也可能涉及元空间等相关区域的处理。具体行为取决于收集器和 JVM 实现。

可能触发 Full GC 的情况#

  • 老年代空间不足。
  • 对象晋升时,老年代无法满足内存分配需求。
  • 调用 System.gc(),但这只是请求,JVM 可以选择忽略。
  • JVM 或特定垃圾收集器中的其他内存管理条件。

为什么要关注 Full GC#

频繁的 Full GC 可能导致:

  • 程序停顿增加。
  • 请求响应时间变长。
  • 应用吞吐量下降。
  • 如果内存问题持续存在,最终可能出现 OutOfMemoryError。

但 Full GC 并不一定意味着程序存在内存泄漏,需要结合 GC 日志和内存使用情况分析。

三者的关系#

新生代空间需要回收
|
v
Young GC
|
v
存活对象被保留或晋升
|
v
老年代空间是否充足?
|
+----+----+
| |
充足 不足
| |
继续运行 可能触发更大范围的回收
|
v
Full GC 等

这是简化示意图,不代表所有收集器都严格按照该流程运行。

面试回答模板#

问:Minor GC、Major GC、Full GC 有什么区别?

答:

Minor GC 通常指新生代垃圾回收,也常称为 Young GC,主要回收新生代中的垃圾对象。

Major GC 在传统分代语境下通常指老年代垃圾回收,但不同 JVM 实现中的定义可能不同。

Full GC 通常表示范围更广的回收,在常见 HotSpot JVM 语境中一般涉及整个堆,并可能包含其他相关内存区域的处理。

如果程序频繁发生 Full GC,需要结合 GC 日志分析是否存在老年代空间不足、对象分配过多、缓存过大或内存泄漏等问题。

需要记住的重点#

  • Minor GC / Young GC:通常回收新生代。
  • Major GC:传统语境下通常与老年代回收有关。
  • Full GC:通常涉及范围更广的回收。
  • Major GC 不一定等于 Full GC。
  • Full GC 频繁不一定代表内存泄漏,需要分析日志。
  • System.gc() 只是请求,不保证立即执行 Full GC。

自测题#

题目 1#

通常负责回收新生代的 GC 是什么?

答案:Young GC,也常称为 Minor GC。

题目 2#

Major GC 在所有 JVM 中都严格等于 Full GC 吗?

答案:不是。这些术语在不同 JVM 实现和收集器中的含义可能不同。

题目 3#

发现 Full GC 频繁,应该怎么办?

答案:结合 GC 日志、堆内存使用情况和对象引用关系分析原因,排查内存配置不合理、对象分配过多、缓存过大或内存泄漏等问题。

题目 4#

调用 System.gc() 是否保证立即进行 Full GC?

答案:不保证。它只是向 JVM 发出建议,JVM 可以忽略该请求。

Minor GC、Major GC、Full GC 的区别
https://blog.xqcherry.top/posts/interview/jvm/minor-major-full-gc/
作者
xqcherry
发布于
2026-10-09
许可协议
CC BY-NC-SA 4.0