Java 中的 young GC、old GC、full GC 和 mixed GC 的区别是什么?
Java 中的 young GC、old GC、full GC 和 mixed GC 的区别
在 Java 中,垃圾回收(GC)可以分为几种不同类型,包括 young GC、old GC、full GC 和 mixed GC。每种 GC 类型有其特定的作用域和目标,下面详细介绍它们的区别。
1. Young GC(年轻代垃圾回收)
特点:
- 作用范围:仅回收新生代中的对象。
- 回收过程:主要清理 Eden 区 和 Survivor 区 中的对象。
- 回收触发:当新生代的内存空间不足时触发。
- 回收频率:由于新生代对象通常生命周期较短,Young GC 会频繁发生。
- 算法:一般使用 复制算法,通过复制存活的对象到 Survivor 区,并清除不再存活的对象。
优点:
- 高效:由于大多数对象都很快变成垃圾,回收速度较快。
示例:
- 每次 Minor GC 都是 Young GC,专注于新生代的回收。
2. Old GC(老年代垃圾回收)
特点:
- 作用范围:仅回收老年代中的对象。
- 回收过程:老年代中的对象通常是存活较长时间的对象,老年代的回收相对较慢。
- 回收触发:当老年代内存空间不足时触发。
- 回收算法:常使用 标记-清除 或 标记-整理算法,回收的过程会涉及对象的整理,减少内存碎片。
优点:
- 较少发生:相比新生代的垃圾回收,Old GC 发生的次数较少,通常发生在系统运行时间较长时。
示例:
- 每次 Major GC 或 Full GC 都涉及到 Old GC,专注于回收老年代的对象。
3. Full GC(完全垃圾回收)
特点:
- 作用范围:回收整个堆内存,包括 新生代 和 老年代。
- 回收过程:执行整个堆的回收,涉及到 Young GC 和 Old 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 GC 和 Old GC 专注于回收不同内存区域。
- Full GC 涉及整个堆的回收,通常会停顿较长时间。
- Mixed GC 在 G1 GC 中回收新生代和部分老年代,优化了垃圾回收效率。