Generational Collection(分代收集)
分代收集算法中;将堆区内存划分为了三部分:新生代、老年代、永久代;
新生代:
- 主要用来存放新生的对象,一般占据堆区内存空间的三分之一;新生代中,保存着大量创建不久的对象,但是大部分对象都是存活不久。
- 在新生代中内存又划分为 8 : 1 : 1 ; 8--Eden区(新生对象) , 1--Survivor0 区 和 1--Survivor1区。
- 大部分对象都是在 Eden区 中生成,在垃圾回收时,先将 Eden 区的存活对象复制一份到 Survivor0 区,然后清空 Eden 区;如是 Survivor0 区内存不再足以存放 Eden 区存活的对象时,就会将 Eden 区 和 Survivor0 区 内存活的对象复制一份到 Survivor1 区,然后就清除 Eden 区和 Survivor0 区的内存,然后 Survivor0 区清空出来之后就会与 Survivor1 区互换,以确保 Survivor1 区 为空。依次反复循环步骤;
- 最后,当 Survivor1 区也是不足以存放 Eden 区 和 Survivor0 区 内存活的对象时,就会将存活的对象直接存放至老年代
- 当老年代也是存放满时,就会直接触发一次 标记——清除算法(Full GC),会将存放的老年代和新生代进行回收。。
老年代:
- 存放大对象,比如:new int [ 1024*1028 ]
- 存放生命周期较长的对象(一般经历 15 次 MinorGC 还在存活的对象)MinorGC :新生代中发生的垃圾回收
- MinorGC 发生的频率较高,不一定 Eden 区满了才触发。
永久代:
- 永久代:永久保存区域。主要用来存放 Class 和 Meta(元数据)的信息。
- 比如:常量,字符串常量池,类的信息(类的结构)