> 技术文档 > Java 垃圾回收(GC)机制里,Young GC、Old GC、Full GC、Mixed GC_g1垃圾回收器的mixedgc与fullgc有区别嘛

Java 垃圾回收(GC)机制里,Young GC、Old GC、Full GC、Mixed GC_g1垃圾回收器的mixedgc与fullgc有区别嘛

在 Java 垃圾回收(GC)机制里,Young GC、Old GC、Full GC、Mixed GC 是不同场景下的垃圾回收行为,它们在回收区域、触发条件、执行流程等方面存在区别,下面详细介绍:

1. Young GC(新生代垃圾回收)

  • 回收区域:主要针对 Java 堆中的新生代(Eden 区 + 部分 Survivor 区,如 From Survivor ),新生代是对象诞生、短期存活的区域,采用复制算法(Copying Algorithm )。
  • 触发条件:当新生代的 Eden 区空间不足,无法为新创建的对象分配内存时,就会触发 Young GC 。比如不断创建新对象,Eden 区被填满,此时会暂停应用线程(Stop The World,简称 STW ,但现代 JVM 优化后停顿时间逐步缩短 ),进行新生代垃圾回收 。
  • 执行过程
    • 把 Eden 区和 From Survivor 区中存活的对象,复制到 To Survivor 区 。
    • 清空 Eden 区和 From Survivor 区,方便后续新对象分配 。
    • 若对象在 Survivor 区经历一定次数的 GC 仍存活(通过 -XX:MaxTenuringThreshold 参数设置年龄阈值 ),会晋升到老年代
  • 特点:由于新生代对象大多“朝生夕死”,存活对象少,复制算法效率高,Young GC 相对频繁,但停顿时间通常较短 。

2. Old GC(老年代垃圾回收)

  • 回收区域:仅针对老年代(Tenured/Old Gen ),老年代存放长期存活的对象,一般采用标记 - 整理算法(Mark - Compact )或标记 - 清除算法(Mark - Sweep ,可能伴随碎片问题 ),不同垃圾回收器实现有差异 。
  • 触发条件
    • 老年代空间不足,比如大对象直接进入老年代(超过新生代 Eden 区大小且无法在 Survivor 区容纳 )、新生代对象晋升到老年代导致老年代空间不够 。
    • 持久代(元空间,MetaSpace ,JDK 8 及以后替代永久代 )空间不足时,部分垃圾回收器(如 CMS )可能触发老年代回收相关操作,不过元空间本质与老年代不同,这里主要针对老年代堆内存 。
    • 显式调用 System.gc() (虽然不建议,但可能触发 ,不过具体是否执行老年代回收要看 JVM 策略 )。
  • 执行过程:标记老年代中存活的对象,然后进行整理(标记 - 整理,将存活对象移动到一起,腾出连续空间 )或清除(标记 - 清除,直接回收垃圾对象,会产生内存碎片 )。标记 - 整理因需移动对象,相对耗时 。
  • 特点:老年代对象存活时间长、数量可能较多,Old GC 触发频率低,但停顿时间通常比 Young GC 长,对应用性能影响更大 。

3. Full GC(全量垃圾回收)

  • 回收区域:涵盖整个 Java 堆(新生代 + 老年代 + 元空间等,不同 JVM 实现可能有差异,还可能包括方法区的永久代/元空间 ),以及部分直接内存(取决于垃圾回收器是否处理 ),是最“全面”的垃圾回收 。
  • 触发条件
    • 老年代空间不足且无法通过 Old GC 有效回收(如 CMS 回收老年代后碎片过多,无法分配大对象 )。
    • 永久代(元空间)空间不足,需要清理不再使用的类元数据等 。
    • 系统调用 System.gc() 且 JVM 响应此请求(不过很多情况下 JVM 会忽略,避免频繁 Full GC )。
    • 垃圾回收器的自适应策略触发(如 G1 收集器在混合回收无法满足内存需求时可能触发 Full GC )。
  • 执行过程:不同垃圾回收器执行流程有别,总体是对整个堆进行标记 - 清除、标记 - 整理或其他组合操作,涉及所有区域的垃圾判定和回收 。
  • 特点:Full GC 会暂停所有应用线程(STW 时间长 ),对应用性能冲击大,应尽量避免频繁触发 。通常出现 Full GC 意味着内存管理可能存在问题(如内存泄漏、新生代晋升策略不合理 ),需排查优化 。

4. Mixed GC(混合垃圾回收,G1 收集器特有)

  • 回收区域:主要针对 G1 收集器划分的多个 Region ,包括部分新生代 Region 和部分老年代 Region (混合回收 ),不是严格意义上的全堆回收 。G1 把堆划分为很多大小相等的 Region ,新生代和老年代不再是物理隔离的连续区域,而是逻辑上的 。
  • 触发条件:G1 收集器在 Young GC 之后,根据堆内存使用情况、预测的停顿时间等,决定是否触发 Mixed GC 。当老年代使用比例达到一定阈值(可通过参数调整,如 -XX:InitiatingHeapOccupancyPercent ),就会触发,目的是逐步回收老年代中垃圾较多的 Region ,避免等到老年代满了才进行 Full GC 。
  • 执行过程
    • 先进行类似 Young GC 的操作,回收新生代 Region 。
    • 然后选择部分老年代 Region(垃圾占比高的 ),进行标记和回收,采用复制算法(将存活对象复制到其他 Region ),同时整理内存碎片 。
  • 特点:Mixed GC 是 G1 收集器为了平衡新生代和老年代回收、控制停顿时间设计的,它不是 Full GC ,只回收部分 Region ,能在一定程度上避免 Full GC 的长停顿,让垃圾回收更高效、可预测 。

总结对比

类型 回收区域 触发条件核心因素 典型垃圾回收器支持情况 对应用停顿影响(一般情况 ) Young GC 新生代(Eden + Survivor ) 新生代空间不足 所有回收器(Serial、Parallel、G1 等 ) 短,相对频繁 Old GC 老年代 老年代空间不足等 CMS、Serial Old 等(不同回收器实现 ) 较长,频率低 Full GC 全堆(新生代 + 老年代 + 元空间 ) 老年代/元空间严重不足、显式触发等 所有回收器(但应尽量避免触发 ) 很长,严重影响性能 Mixed GC G1 部分新生代 + 部分老年代 Region G1 老年代使用达阈值,平衡回收需求 G1 收集器特有 介于 Young GC 和 Full GC 之间,可控

实际应用中,要通过监控 GC 日志、堆内存使用情况等,分析不同 GC 类型的触发频率和影响,优化 JVM 参数(如新生代大小、晋升阈值、垃圾回收器选择 ),减少 Full GC 等长停顿对系统的冲击 。