Java 中的 young GC、old GC、full GC 和 mixed GC 的区别是什么?

Sherwin.Wei Lv8

Java 中的 young GC、old GC、full GC 和 mixed GC 的区别是什么?

回答重点

Young GC(Minor GC 或 YGC),即年轻代垃圾回收

  • 作用范围:仅针对新生代(Eden 和 S0/S1)。
  • 触发条件:当新生代内存(尤其是 Eden 区)被填满时触发。
  • 执行方式:只回收新生代中的对象,老年代不受影响。
  • 特点:回收频率较高,回收时间较短,因为新生代中的对象大多数是短命对象,容易被回收。

Old GC(Major GC 或 OGC),老年代垃圾回收

  • 作用范围:只针对老年代。
  • 触发条件:当老年代空间不足时触发,通常是当从新生代晋升到老年代的对象过多,或者老年代的存活对象数量达到一定阈值时。
  • 执行方式:只回收老年代的对象,新生代不受影响。
  • 特点:执行时间比 Young GC 长,因为老年代中的对象存活时间更长,且数量较多。

Full GC,全堆垃圾回收

  • 作用范围:对整个堆内存(包括新生代和老年代)进行回收。
  • 触发条件:当老年代空间不足且无法通过老年代垃圾回收释放足够空间,或其他情况导致系统内存压力较大时触发(如 System.gc() 调用)。
  • 执行方式:回收所有代(新生代、老年代)中的垃圾,并且可能会伴随着元空间的回收。
  • 特点:回收时间最长,会触发整个 JVM 的停顿(Stop-The-World),对性能有较大影响,通常不希望频繁发生。

Mixed GC(仅适用于 G1 GC 的混合垃圾回收):

  • 作用范围:同时回收新生代和部分老年代区域。
  • 触发条件:当 G1 垃圾回收器发现老年代区域的垃圾过多时触发。
  • 执行方式:混合回收新生代和部分老年代区域,主要目的是减少老年代中的垃圾积压。
  • 特点:结合了 YGC 的快速回收和 OGC 的深度回收,尽量减少停顿时间,适用于大内存应用。

扩展知识

为什么要老年代和年轻代

Comments
On this page
Java 中的 young GC、old GC、full GC 和 mixed GC 的区别是什么?