minorGC、majorGC、fullGC的区别

在 Java 虚拟机 (JVM) 中,垃圾回收 (Garbage Collection, GC) 是一个自动管理内存的重要机制,它负责回收不再使用的对象所占用的内存。在 JVM 的不同代(Generation)中,垃圾回收有不同的类型,主要包括 Minor GC、Major GC 和 Full GC。

Minor GC (Young Generation GC)

  • 作用区域:Minor GC 主要在 JVM 的年轻代(Young Generation)中进行,年轻代又细分为 Eden 区和两个 Survivor 区(S0 和 S1)。
  • 触发条件:当 Eden 区的空间被填满时,会触发 Minor GC。Survivor 区的满并不会直接触发 Minor GC。
  • 行为:在 Minor GC 过程中,Eden 区和 Survivor 区中的对象会被扫描,不再被引用的对象会被清除。存活的对象会被复制到另一个 Survivor 区,或者如果对象存活时间足够长,会被移动到老年代(Old Generation)。
  • 影响:Minor GC 相对频繁,但由于年轻代的对象生命周期往往较短,所以 Minor GC 的执行时间相对较短。

Major GC (Old Generation GC)

  • 作用区域:Major GC 主要发生在老年代(Old Generation)中。
  • 触发条件:当老年代的空间不足时,会触发 Major GC。此外,如果 Minor GC 后,从年轻代晋升到老年代的对象导致老年代空间不足,也会触发 Major GC。
  • 行为:Major GC 会清理老年代中的对象,不再被引用的对象会被回收。如果启用了 CMS 或 G1 等垃圾回收器,可能会只清理老年代,但默认情况下,Major GC 往往会伴随 Full GC。
  • 影响:Major GC 的执行时间可能比 Minor GC 长得多,因为它涉及的对象更多,而且对象的生命周期更长,可能需要更多的计算来判断哪些对象可以被回收。

Full GC

  • 作用区域:Full GC 清理整个堆内存(Heap),包括年轻代、老年代以及永久代(Permanent Generation,已被 Metaspace 替换)或元空间(Metaspace)。
  • 触发条件:
    • 调用 System.gc() 方法时,JVM 会建议执行 Full GC,但不一定执行。
    • 当老年代空间不足时,如果没有足够的空间来存放 Minor GC 后晋升的对象。
    • 当方法区(Method Area)或 Metaspace 空间不足时。
    • 通过 Minor GC 后进入老年代的平均对象大小大于老年代的可用内存。
  • 行为:Full GC 清理整个堆内存和方法区/元空间,回收不再被引用的对象。
  • 影响:Full GC 的执行时间最长,因为它涉及的内存区域最广,对应用的性能影响最大。因此,优化 Full GC 的频率和执行时间是 JVM 性能调优的重点之一。
posted @ 2024-07-01 01:12  使用D  阅读(7)  评论(0编辑  收藏  举报