Java虚拟机的垃圾回收过程中,分代垃圾回收是一种常用的策略。这个策略基于一个观察:大部分对象的生命周期很短暂,而只有少数对象会长时间存活。因此,将堆内存分为不同的代(Generations),分别对待不同生命周期的对象,可以更好地利用垃圾回收的特性。

分代垃圾回收一般将堆分为三代:新生代(Young Generation)、年老代(Old Generation或Tenured Generation)和永久代(Permanent Generation)。以下是简单描述的分代垃圾回收过程:

  1. 新生代(Young Generation):

    • Eden区: 对象首先被分配到Eden区。大部分对象都是朝生夕死的,因此Eden区很容易填满。
    • Survivor区: 当Eden区满时,发生一次Minor GC(新生代垃圾回收)。存活的对象会被移到Survivor区。Survivor区有两个,一般情况下一个为空,另一个用于存放上一次垃圾回收中存活的对象。
    • 对象晋升: 经过多次Minor GC后,仍然存活的对象会被晋升到年老代。
  2. 年老代(Old Generation):

    • 对象持久性: 存活时间较长的对象会被移到年老代。这里的垃圾回收被称为Major GC(或Full GC)。
    • Full GC: 当年老代的空间不足时,会触发一次Full GC,对整个堆进行垃圾回收,包括新生代和年老代。Full GC会导致较长的暂停时间。
  3. 永久代(Permanent Generation):

    • 存放类信息: 永久代主要存放类的元信息、静态变量、常量池等。在Java 8之后,永久代被移除,被称为元空间(Metaspace)。

分代垃圾回收利用了不同对象生命周期的特点,通过不同的回收算法和频率来提高垃圾回收的效率。新生代采用复制算法,年老代采用标记-清除或标记-整理算法。这种分代的垃圾回收策略能够更好地适应不同对象的生命周期,提高整体垃圾回收的效率。

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.