minor gc仅回收年轻代,eden满即触发,stw短;“major gc”非标准术语,泛指仅回收老年代的场景;full gc回收全堆(含元空间),stw长,由老年代/元空间不足或显式调用等引发。

Java 垃圾回收中,Minor GC、Major GC 和 Full GC 的核心差异不在名称,而在于回收范围、触发逻辑和实际影响。理解它们的关键,是抛开“Major GC”这个非标准术语的干扰,聚焦 JVM 实际行为——尤其看 GC 日志里明确标注的回收区域(Young / Old / Metaspace)和动作类型。
Minor GC:只动年轻代,Eden 满就触发
它是最常规、最频繁的回收动作,只作用于年轻代(Eden + 一个 Survivor 区),采用复制算法,STW 时间短(通常 1–50ms)。
- 主触发条件:新对象分配时,Eden 区没有足够连续空间 —— 不管 Eden 占用率是 40% 还是 95%,只要这次分配失败,立刻 Minor GC
- 次要路径包括:TLAB 分配失败后回退到 Eden 全局分配仍失败;大对象尝试直接进入老年代但失败,JVM 会先 Minor GC 尝试腾出空间再重试
- 注意:Survivor 区满、对象年龄达阈值、同龄对象超 50% 等,都不会单独触发 Minor GC,它们只是晋升决策点,不是触发源
“Major GC”:不是独立事件,而是老年代回收的俗称
JVM 规范中没有 “Major GC” 这一正式类型。它常被用来指代仅回收老年代的 GC 行为,比如 CMS 的并发标记清除阶段、G1 的部分 Mixed GC,或某些配置下 SerialOld 对老年代的单独回收。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 它不自动发生,往往由 Minor GC 后的晋升失败(Promotion Failure)间接引发
- 如果 GC 日志显示只有 [GC (Allocation Failure)] 或 [GC (CMS Initial Mark)] 且仅扫描 Old 区,没涉及 Young 或 Metaspace,那才是狭义的“Major GC”
- 多数情况下,“Major GC” 在监控工具或口头表达中实际等同于 Full GC,容易造成误解
Full GC:整堆+元空间全扫,代价最高
这是唯一覆盖全部内存区域的回收:年轻代 + 老年代 + 元空间(Metaspace)。STW 时间长(百毫秒到数秒),应尽量避免。
- 老年代连续空闲空间不足,无法容纳 Minor GC 后晋升的对象或直接分配的大对象
- 元空间耗尽:如 Spring AOP、CGLib 动态代理生成大量类,且 ClassLoader 未释放,超过 -XX:MaxMetaspaceSize
- 显式调用 System.gc(),且未设置 -XX:+DisableExplicitGC
- Minor GC 前的晋升担保检查失败:JVM 预估老年代剩余空间
- 垃圾收集器特定场景:CMS 发生 Concurrent Mode Failure;G1 混合回收跟不上分配速度;ZGC 在元空间扩容失败时也可能触发
真正需要关注的,不是术语叫什么,而是每次 GC 日志里写明了哪些区域被回收、为什么停顿这么久。盯住日志中的 “GC pause” 类型、耗时、前后堆内存变化,比纠结 “这是 Major 还是 Full” 更有效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










