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

Java 中的 young GC、old GC、full GC 和 mixed GC 的区别

在 Java 中,垃圾回收(GC)可以分为几种不同类型,包括 young GCold GCfull GCmixed GC。每种 GC 类型有其特定的作用域和目标,下面详细介绍它们的区别。


1. Young GC(年轻代垃圾回收)

特点:

  • 作用范围:仅回收新生代中的对象。
  • 回收过程:主要清理 Eden 区Survivor 区 中的对象。
  • 回收触发:当新生代的内存空间不足时触发。
  • 回收频率:由于新生代对象通常生命周期较短,Young GC 会频繁发生。
  • 算法:一般使用 复制算法,通过复制存活的对象到 Survivor 区,并清除不再存活的对象。

优点:

  • 高效:由于大多数对象都很快变成垃圾,回收速度较快。

示例:

  • 每次 Minor GC 都是 Young GC,专注于新生代的回收。

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

特点:

  • 作用范围:仅回收老年代中的对象。
  • 回收过程:老年代中的对象通常是存活较长时间的对象,老年代的回收相对较慢。
  • 回收触发:当老年代内存空间不足时触发。
  • 回收算法:常使用 标记-清除标记-整理算法,回收的过程会涉及对象的整理,减少内存碎片。

优点:

  • 较少发生:相比新生代的垃圾回收,Old GC 发生的次数较少,通常发生在系统运行时间较长时。

示例:

  • 每次 Major GCFull GC 都涉及到 Old GC,专注于回收老年代的对象。

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

特点:

  • 作用范围:回收整个堆内存,包括 新生代老年代
  • 回收过程:执行整个堆的回收,涉及到 Young GCOld GC 的回收。
  • 回收触发:通常发生在以下情况:
    • 老年代空间不足时。
    • JVM 内存压力较大时。
    • 显式调用 System.gc() 时。
  • 影响:由于涉及整个堆的回收,Full GC 会停顿时间较长。

优点:

  • 彻底清理内存:通过回收整个堆,保证系统内存的彻底清理。

示例:

  • JVM 内存达到限制时,可能会触发 Full GC

4. Mixed GC(混合垃圾回收)

特点:

  • 作用范围:回收 新生代部分老年代 对象。
  • 回收过程:在回收新生代的同时,还会回收部分老年代的对象。
  • 回收触发:一般发生在使用 G1 GC(Garbage-First GC)时,当新生代的垃圾回收同时需要回收一部分老年代时。
  • 回收算法:结合了新生代的 复制算法 和老年代的 标记-整理算法

优点:

  • 提高回收效率:通过同时回收部分老年代,减少了老年代的内存压力,提高了垃圾回收的整体效率。

示例:

  • 使用 G1 GC 的时候,回收新生代和部分老年代的过程通常就是 Mixed GC

5. 总结

GC 类型 作用范围 触发时机 回收算法 优点
Young GC 新生代 新生代内存不足时 复制算法 回收快速,频繁发生
Old GC 老年代 老年代内存不足时 标记-整理、标记-清除算法 回收速度较慢,但发生频率较低
Full GC 新生代和老年代(整个堆) 堆内存不足、显式调用 System.gc() 综合回收 徹底回收内存,影响较大
Mixed GC 新生代和部分老年代 G1 GC 下,当新生代回收时,也回收部分老年代 复制算法 + 标记-整理算法 回收效率高,减少老年代压力

结论:

  • Young GCOld GC 专注于回收不同内存区域。
  • Full GC 涉及整个堆的回收,通常会停顿较长时间。
  • Mixed GCG1 GC 中回收新生代和部分老年代,优化了垃圾回收效率。
posted @ 2024-12-11 12:41  Eiffelzero  阅读(1096)  评论(0)    收藏  举报