分代的理论基础
在 java 中,大部分对象存在时间很短,小部分对象存活时间长一些,而且存活时间长的对象会存在很长时间。按照二八定律的说法:80%的对象占总存活时间的 20%,剩下 20%的对象存活时间却占了总存活时间的 80%
分代方法
根据 java 对象的存活规律,可以将jvm 堆空间划分为新生代和老年代。新生代存放刚刚被创建的 java 对象(顾名思义嘛,新生代),老年代存放已经存活了一段时间的 java 对象(存活时间长了自然就进入了老年)。
根据新生代 java 对象的特点:绝大部分都会在很短时间内变成垃圾,被下一次垃圾回收操作所清除。因此可以给新生代订制一款改进的复制算法。
将新生代所占用的堆空间进一步分为 eden 区和 survivors 区,且 s 区分为 s1 区和 s2 区。e 区空间较大,讲个 s 区空间较小,每次使用 e 区和 s 区的某一个。例如,先使用 e+s1,当没有足够空间时,将 e+s1 中的存活对象放到 s2,然后全部回收 e+s1 的空间,下一个阶段使用 e+s2,就这样依次循环。
在每次新生代垃圾回收时,记录每个对象的存活时长,当超过存活时长阈值(可设定),则该对象将会被放到老年代中。
对于老年代,其中的 java 对象的存活特点是:存活时间长,垃圾率低。因此,在老年代垃圾回收的操作频率会极大降低,而且每次垃圾回收的数量也不多。由于这些特点,老年代一般选择使用标记-整理算法。