什么是GC分代?有哪些分代?

GC分代是Java垃圾收集器的一个概念。根据对象的存活时间长度不同,Java将堆内存划分为几个不同的区域,这些区域被称为“代”。

通常Java垃圾收集器会有以下几个分代:

  • 1. 新生代(Young Generation):存放较新的对象。新创建的对象首先被分配在新生代中。新生代采用较为频繁的垃圾收集算法,因为新生代中的对象存活率较低。
  • 2. 老年代(Old Generation):存放较老的对象。经过多次垃圾收集,在新生代中存活下来的对象会被晋升到老年代。老年代的对象存活率较高,所以使用较少的垃圾收集算法。
  • 3. 永久代(Permanent Generation): HotSpot VM中,用于存储类的相关信息,常量池及其它。JDK 1.8中已去除,由元数据区替代。
  • 4. 元数据区(Metaspace):JDK 1.8中替代了永久代,用于存储类的元数据。
    其中新生代和老年代是Java堆的两个主要区域,用于存储对象实例。

新生代由Eden空间和两个Survivor空间组成。Eden空间用于新创建的对象。Survivor空间用于存放从Eden区存活下来的对象。

当新生代填满触发垃圾收集时,Eden区和其中一个Survivor区的存活对象会被移到另一个Survivor区,然后清空Eden区和刚才的Survivor区。重复这一过程,直到一个Survivor区填满,这时会将所有的新生代对象晋升到老年代。

GC分代通过区分对象的存活周期,采用不同的垃圾收集算法,能更高效地进行垃圾收集,减少内存的消耗。