什么是 MinorGC 和 FullGC?

在 Java 虚拟机(JVM)中,垃圾回收(Garbage Collection, GC)是自动管理内存的核心机制。MinorGCFullGC 是两种不同类型的垃圾回收行为,它们负责清理不同区域的内存。


🧒 1. MinorGC:年轻代的清洁工

  • 触发条件:当 年轻代(Young Generation) 中的 Eden 区内存不足时触发。
  • 作用范围:只清理年轻代(包括 Eden 区和 Survivor 区)。
  • 频率:高频发生(通常每秒几次到几十次)。
  • 速度:速度快,暂停时间短(毫秒级)。
  • 过程
    1. 将 Eden 区存活的对象复制到 Survivor 区(S0 或 S1)。
    2. 清理 Eden 区和另一个 Survivor 区的垃圾对象。
    3. 存活对象达到年龄阈值(默认 15)后晋升到老年代。

故事比喻
想象你家有个小型垃圾桶(Eden 区),每天产生的快餐盒、饮料瓶(临时对象)会快速填满它。
MinorGC 就像一个高效的清洁机器人,每晚快速清理这个小垃圾桶,把还能用的餐具(存活对象)移到厨房柜子(Survivor 区),其他垃圾直接扔掉。


👴 2. FullGC:全堆大扫除

  • 触发条件:老年代空间不足、方法区(Metaspace)不足或手动调用 System.gc()
  • 作用范围:清理整个堆(年轻代 + 老年代 + 方法区)。
  • 频率:低频发生(可能几小时一次)。
  • 速度:速度慢,暂停时间长(秒级甚至分钟级),会触发 Stop-The-World(暂停所有应用线程)。
  • 过程
    1. 标记所有存活对象。
    2. 清理整个堆的垃圾对象。
    3. 压缩内存碎片(可选)。

故事比喻
如果厨房柜子(老年代)和储物间(方法区)都堆满了旧家电、家具(长期对象),就需要全家大扫除(FullGC)。
所有家庭成员(应用线程)必须暂停活动,等清洁公司彻底清理房屋,过程耗时但能释放大量空间。


🔍 关键对比

特性 MinorGC FullGC
作用区域 仅年轻代 整个堆 + 方法区
速度 快(毫秒级) 慢(秒级或更长)
频率 高频 低频
影响 轻微暂停 严重暂停(Stop-The-World)
触发条件 Eden 区满 老年代/方法区满或手动调用

📊 内存结构图解

在这里插入图片描述

💎 总结

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

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐