Java-Jvm中GC类型及执行时机

发布时间 2023-12-15 13:02:42作者: 安浩阳

Java-Jvm中GC类型及执行时机

堆的结构

  1. 年轻代(Young Generation):

    • Eden区: 在年轻代中,对象首先被分配到Eden区。大多数对象很快就会被回收,所以它们被分配到Eden区以提高分配速度。
    • Survivor区(S0和S1): Eden区中存活的对象会被移动到Survivor区。每次发生Minor GC时,存活的对象会被移动到另一个Survivor区。这两个Survivor区之间会进行对象的交换。
  2. 老年代(Old Generation):

    • 老年代: 存放在年轻代中经历多次垃圾回收仍然存活的对象。通常,老年代比年轻代的空间要大,因为存活较长的对象会被转移到老年代。
  3. 永久代(Permanent Generation): (Java 8之前)

    • 方法区(Method Area): 包含类的元数据、静态变量、常量等。在Java 8之前,类的元数据和常量池等信息存储在永久代中。然而,永久代在Java 8中被元空间(Metaspace)取代。
  4. 元空间(Metaspace): (Java 8及之后)

    • 元空间: 用于存储类的元数据,例如类的结构信息、方法信息等。在Java 8及之后,元空间替代了永久代,它的大小不再受到默认或最大堆大小的限制,而是由操作系统的可用内存决定。

GC类型及执行时机

  1. Minor Garbage Collection (Young Generation GC):

    • 执行时机: Minor GC主要发生在年轻代(Young Generation)。它回收年轻代中不再被引用的对象。通常在新生代满时触发,即当Eden区满时,触发一次Minor GC。
    • 执行内容: Minor GC使用复制算法,将存活的对象复制到另一块幸存区(Survivor)或老年代。同时,清理掉不再被引用的对象。这个过程相对较快,因为年轻代的大小通常较小。
  2. Major Garbage Collection (Old Generation GC):

    • 执行时机: Major GC主要发生在老年代(Old Generation)。它回收老年代中的不再被引用的对象。通常是在老年代的空间不足时触发。
    • 执行内容: Major GC使用标记-清除(Mark and Sweep)或标记-整理(Mark and Compact)算法。这个过程相对较慢,因为老年代的大小通常较大。
  3. Full Garbage Collection:

    • 执行时机: "Full GC" 是一个更广泛的术语,它可以包括对整个堆内存的回收,包括年轻代和老年代。有时,"Full GC" 可能指的是同时对年轻代和老年代执行垃圾回收的操作。
    • 执行内容: 在"Full GC"中,整个堆内存都会被回收。这通常包括执行Minor GC和Major GC,可能还包括一些额外的清理工作,例如对永久代(在Java 8之前)或元空间(在Java 8及之后)的回收。

    实际上,不同的垃圾回收器和JVM实现可能有不同的策略和行为。"Full GC"通常是在一些比较特殊的情况下触发的,例如老年代空间不足、永久代(Java 8之前)或元空间(Java 8及之后)溢出等。