【标记压缩算法】
标记压缩算法如下图所示:
- 由于老年代的对象存活率很高,不容易被消亡,而复制算法不仅存在空间浪费,而且当老年代对象很多的时候,复制对象的效率会非常的低,所以,基于老年代的特性,产生了标记压缩算法。
- 它在标记清除算法的基础上做了优化,和标记清除算法一样,也是首先需要从根节点开始,对所有可达对象做一次标记。但之后,它并不是简单地清理未标记的对象,而是将所有的存活对象压缩到内存的一端,然后,清理边界外所有的空间。这种方法即避免了碎片的产生,又不需要两块相同的内存空间,因此,性价比很高。
【分代算法】
分代算法如下图所示:
- 当前jvm的垃圾回收,都是采用分代收集算法
- 针对新生代由于GC都有大量对象死去被回收,少数存量对象,只需要复制少量对象,就可以完全清除S0/S1的垃圾对象空间。所以采用“复制算法”更为合适;
- 而老年代对象存活率高,每次GC只清除少部分对象,所以采用“标记-清除”和“标记-压缩”算法来回收。