Minor GC、Major GC 和 Full GC 是 Java 垃圾回收(GC)中的三种主要类型,它们在垃圾回收过程中有不同的作用和触发条件。以下是它们之间的详细区别:
1. **Minor GC**:
- **作用**:Minor GC 主要发生在年轻代(包括 Eden 区和 Survivor 区)。其目的是回收年轻代中的垃圾对象。由于大多数对象都是朝生夕灭的,Minor GC 非常频繁,且回收速度较快。
- **触发条件**:当 Eden 区满时,会触发 Minor GC。Minor GC 会将存活的对象从 Eden 区复制到 Survivor 区,并增加这些对象的年龄。当对象的年龄达到一定阈值(默认为 15 岁)时,它们会被晋升到老年代。
- **影响**:Minor GC 通常不会影响应用程序的运行,因为它只涉及年轻代的内存回收,且回收过程较快。
2. **Major GC**:
- **作用**:Major GC 主要发生在老年代。其目的是清理老年代中的垃圾对象。Major GC 的速度通常比 Minor GC 慢 10 倍以上。
- **触发条件**:Major GC 通常由 Minor GC 触发。当 Minor GC 发生后,如果老年代的内存仍然不足,就会触发 Major GC。此外,Major GC 也可以通过调用 `System.gc()` 显式触发。
- **影响**:Major GC 会对应用程序的性能产生较大影响,因为它需要停止应用程序的线程来进行垃圾回收。
3. **Full GC**:
- **作用**:Full GC 清理整个堆空间,包括年轻代和老年代。其目的是回收整个 JVM 堆中的垃圾对象。
- **触发条件**:
1. 调用 `System.gc()` 时,系统建议执行 Full GC,但不是必然执行。
2. 老年代空间不足。
3. 方法区空间不足。
4. 通过 Minor GC 后进入老年代的平均大小大于老年代的可用内存。
5. 由 Eden 区、From Space 区向 To Space 区复制时,对象大小大于 To Space 可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小。
- **影响**:Full GC 会对应用程序的性能产生显著影响,因为它需要停止应用程序的所有线程来进行垃圾回收。Full GC 的时间通常比 Minor GC 和 Major GC 都要长。
总结:
- **Minor GC**:频繁且快速,只影响年轻代。
- **Major GC**:较慢,影响老年代,通常由 Minor GC 触发。
- **Full GC**:最慢,影响整个堆空间,通常在老年代和方法区空间不足时触发。