【Java-JVM】什么是 MinorGC 和 FullGC?
·
什么是 MinorGC 和 FullGC?
在 Java 虚拟机(JVM)中,垃圾回收(Garbage Collection, GC)是自动管理内存的核心机制。MinorGC 和 FullGC 是两种不同类型的垃圾回收行为,它们负责清理不同区域的内存。
🧒 1. MinorGC:年轻代的清洁工
- 触发条件:当 年轻代(Young Generation) 中的 Eden 区内存不足时触发。
- 作用范围:只清理年轻代(包括 Eden 区和 Survivor 区)。
- 频率:高频发生(通常每秒几次到几十次)。
- 速度:速度快,暂停时间短(毫秒级)。
- 过程:
- 将 Eden 区存活的对象复制到 Survivor 区(S0 或 S1)。
- 清理 Eden 区和另一个 Survivor 区的垃圾对象。
- 存活对象达到年龄阈值(默认 15)后晋升到老年代。
故事比喻:
想象你家有个小型垃圾桶(Eden 区),每天产生的快餐盒、饮料瓶(临时对象)会快速填满它。
MinorGC 就像一个高效的清洁机器人,每晚快速清理这个小垃圾桶,把还能用的餐具(存活对象)移到厨房柜子(Survivor 区),其他垃圾直接扔掉。
👴 2. FullGC:全堆大扫除
- 触发条件:老年代空间不足、方法区(Metaspace)不足或手动调用
System.gc()。 - 作用范围:清理整个堆(年轻代 + 老年代 + 方法区)。
- 频率:低频发生(可能几小时一次)。
- 速度:速度慢,暂停时间长(秒级甚至分钟级),会触发 Stop-The-World(暂停所有应用线程)。
- 过程:
- 标记所有存活对象。
- 清理整个堆的垃圾对象。
- 压缩内存碎片(可选)。
故事比喻:
如果厨房柜子(老年代)和储物间(方法区)都堆满了旧家电、家具(长期对象),就需要全家大扫除(FullGC)。
所有家庭成员(应用线程)必须暂停活动,等清洁公司彻底清理房屋,过程耗时但能释放大量空间。
🔍 关键对比
| 特性 | MinorGC | FullGC |
|---|---|---|
| 作用区域 | 仅年轻代 | 整个堆 + 方法区 |
| 速度 | 快(毫秒级) | 慢(秒级或更长) |
| 频率 | 高频 | 低频 |
| 影响 | 轻微暂停 | 严重暂停(Stop-The-World) |
| 触发条件 | Eden 区满 | 老年代/方法区满或手动调用 |
📊 内存结构图解

💎 总结
- MinorGC 是频繁的“局部清理”,负责管理短期对象,速度快且影响小。
- FullGC 是全局的“深度清理”,负责管理长期对象,速度慢且会冻结应用。
- 优化目标:减少 FullGC 频率(如增大老年代、避免内存泄漏),让 MinorGC 承担大部分回收工作。
更多推荐


所有评论(0)