在Java虚拟机中,垃圾收集(Garbage Collection)可以分为两个阶段:年轻代垃圾收集(Minor GC)和老年代垃圾收集(Major GC 或 Full GC)。这些收集事件的发生时机不同,具体如下:
-
Minor GC(年轻代垃圾收集):
- 触发时机: 在年轻代(包括Eden区和Survivor区)中的对象进行垃圾收集的过程称为Minor GC。通常,它发生在年轻代空间不足时。
- 原因: 大多数对象的生命周期很短暂,因此年轻代垃圾收集频繁进行,只有少数对象会存活到一定的年龄(通过对象的年龄计数器判断)。
-
Major GC(老年代垃圾收集):
- 触发时机: 在老年代进行垃圾收集的过程称为Major GC。老年代垃圾收集通常发生在老年代空间不足、永久代空间不足(JVM版本较旧,使用永久代的情况),或者通过CMS等收集器的并发收集周期中。
- 原因: 在年轻代中存活过多次垃圾收集的对象会被晋升到老年代。老年代的垃圾收集周期相对较长,因为对象在老年代存活的时间较长。
-
Full GC(完全垃圾收集):
- 触发时机: Full GC 是对整个堆空间进行垃圾收集的过程,包括年轻代和老年代。Full GC 通常在以下情况下发生:
- 老年代空间不足,并且无法通过Minor GC解决。
- 永久代空间不足(JVM版本较旧,使用永久代的情况)。
- 进行一些特殊的垃圾收集行为,如CMS收集器的阶段切换、G1收集器的整理阶段等。
- 原因: Full GC 是一种较为耗时的垃圾收集操作,会导致应用程序暂停。因此,尽量减少 Full GC 的频率是性能优化的目标。
- 触发时机: Full GC 是对整个堆空间进行垃圾收集的过程,包括年轻代和老年代。Full GC 通常在以下情况下发生:
总的来说,Minor GC频繁发生,主要用于回收短期存活的对象;Major GC和Full GC较为耗时,会导致较长的停顿时间,主要用于回收老年代和整个堆空间。不同的垃圾收集器和配置可以影响这些垃圾收集事件的发生时机和频率。
Was this helpful?
0 / 0