新生代是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象,所以新生代会频繁触发MinorGC 进行垃圾回收。新生代又分为 Eden 区、ServivorFrom、ServivorTo 三个区。

  1. Eden 区
    Java 新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。当 Eden 区内存不够的时候就会触发 MinorGC,对新生代区进行一次垃圾回收。
  2. ServivorFrom
    上一次 GC 的幸存者,作为这一次 GC 的被扫描者。
  3. ServivorTo
    保留了一次 MinorGC 过程中的幸存者。
  4. MinorGC 的过程(复制->清空->互换)
    MinorGC 采用复制算法

    1. eden、servicorFrom 复制到 ServicorTo,年龄+1
      首先,把 Eden 和 ServivorFrom 区域中存活的对象复制到 ServicorTo 区域(如果有对象的年龄以及达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄+1(如果 ServicorTo 不够位置了就放到老年区);
    2. 清空 eden、servicorFrom
      然后,清空 Eden 和 ServicorFrom 中的对象;
    3. ServicorTo 和 ServicorFrom 互换
      最后,ServicorTo 和 ServicorFrom 互换,原 ServicorTo 成为下一次 GC 时的 ServicorFrom区。