JVM GC 原理 2:分代式垃圾回收算法

分代的理论基础

在 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 对象的存活特点是:存活时间长,垃圾率低。因此,在老年代垃圾回收的操作频率会极大降低,而且每次垃圾回收的数量也不多。由于这些特点,老年代一般选择使用标记-整理算法

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容