通用的分代垃圾回收机制
分代垃圾回收机制,是基于这样一个事实,不同的对象的生命周期是不一样的。因此,不同的生命周期的对象可以采用不同的回收算法,便以提高回收效率,我们将对象分为三种状态:年轻代、年老代、持久代。同时,将处于不同状态的对象放到堆不同的区域。JVM将堆内存划分为Eden、Survivor和Tenured/Old空间。
1、年轻代
是所有新生的对象首先是放在Eden区。年轻代的目标就是尽可能快速的收集调那些生命周期短的对象,对应的是Minor GC,每次Minor GC会清理你去年轻代的内存,算法采用效率较高的复制算法,频繁的操作,但是会浪费内存空间。当”年轻代“区域存放满对象后,就将对象存放到老年代区域。
2、老年代
在年轻代中历经了N(默认15)次垃圾回收后仍存活的对象,就会被放到变老代中。因此可以认为年老代中存放的都是一些生命周期较长的对象,年老代对象越来越多,我们就需要MAjor GC和Full GC(全量回收),来一次大扫除,全面清理年轻代区域和年老代区域。
3、永久代
用于存放静态文件,如Java类、方法等。持久对垃圾回收没有显著影响,JDK7以前就是”方法区“的一种实现。JDK8以后就没有”永久代“,使用meta space于数据空间和堆替代。