MinorGC、MajorGC、FullGC

悲观者从机会中看到困难。乐观者从困难中看到机会。
——温斯顿·丘吉尔

在Java中,垃圾回收机制是自动管理内存的重要组成部分。根据其作用范围和触发条件的不同,可以将GC分为三种类型:MinorGc(也称为Young Gc)、Major Gc(有时也称为Old GC)、以及Full GC。以下是这三种GC的区别和触发场景:

Minor Gc (Young GC)

  • 作用范围:只针对年轻代进行回收,包括Eden区和两个Survivor区(S0和S1)。
  • 触发条件:当Eden区空间不足时,JVM会触发一次Minor GC,将Eden区和一个Survivor区中的存活对象移动到另一个Survivor区或老年代(Old Generation)。
  • 特点:通常发生得非常频繁,因为年轻代中对象的生命周期较短,回收效率高,暂停时间相对较短

Major GC

  • 作用范围:主要针对老年代进行回收,但不一定只回收老年代。
  • 触发条件:当老年代空间不足时,或者系统检测到年轻代对象晋升到老年代的速度过快,可能会触发Major GC.
  • 特点:相比Minor GC,Major GC发生的频率较低,但每次回收可能需要更长的时间,因为老年代中的对象存活率较高。

Full GC

  • 作用范围:对整个堆内存(包括年轻代、老年代以及永久代/元空间)进行回收。
  • 触发条件
    • 直接调用 System.gc()或 Runtime.getRuntime().gc()方法时,虽然不能保证立即执行,但JVM会尝试执行FuII GC。
    • Minor Gc(新生代垃圾回收)时,如果存活的对象无法全部放入老年代,或者老年代空间不足以容纳存活的对象,则会触发FuI GC,对整个堆内存进行回收。
    • 当永久代(Java 8之前的版本)或元空间(Java 8及以后的版本)空间不足时。
  • 特点:Fu GC是最昂贵的操作,因为它需要停止所有的工作线程(Stop The World),遍历整个堆内存来查找和回收不再使用的对象,因此应尽量减少FuII GC的触发。
posted @ 2025-03-29 15:48  Tsukinor  阅读(168)  评论(0)    收藏  举报