系列八、四大垃圾算法pk

一、四大垃圾算法pk

内存效率:复制算法 > 标记清除算法 > 标记整理算法(此处的效率只是简单的对比时间复杂度,实际情况不一定如此);

内存整齐度:复制算法 = 标记整理算法 > 标记清除算法;

内存利用率:标记整理算法 = 标记清除算法 > 复制算法;

        可以看出,从效率上来说,复制算法是当之无愧的老大,但是却浪费了太多的内存,而为了尽量兼顾上面所提到的三个指标,标记整理算法相对来说更平滑一些,单效率上依然不尽如人意,它比复制算法多了一个标记的阶段,又比标记清除多了一个内存整理的阶段。那么难道就没有一种最优算法吗?

       

答:无,没有最好的算法,只有最合适的算法,即分代收集算法。

年轻代:

        年轻代的特点是,相对于老年代区域较小,对象存活率低。

        这种情况下,复制算法的回收整理速度是最快的。复制算法的效率只和当前存活对象的大小有关,因而很适合于年轻代的回收。而复制算法内存利用率不高的问题,通过HotSpot中的两个survivor的设计可以得到缓解。

老年代:

        老年代的特点是,相对于年轻代区域较大,对象存活率高。

        (1)这种情况下,存在大量存活率高的对象,复制算法明显变得不合适。一般由标记清除或者标记清除+标记整理的混合实现;

        (2)标记阶段的开销与存活对象的数量成正比,这点上来说,对于老年代,标记清除或者标记整理有一些不符,但是可以通过多核/多线程利用并发、并行的形式提升标记效率;

        (3)清除阶段的开销与所管理区域的大小成比,但标记清除【就地处决】的特点,回收的过程没有对象的移动,使其相对于其他有对象移动步骤的回收算法,效率仍然是最好的,但是需要解决内存碎片的问题;

        (4)整理阶段的开销与存活对象的数据成正比,如上一条描述,对于大量对象的移动是很大的开销,作为老年代的第一选择并不合适;

        (5)基于上面的考虑,老年代一般是由标记清除或者标记清除+标记整理的混合实现,以HotSpot中的CMS回收器为例,CMS是基于Mark-Sweep实现的,对于对象的回收率很高,而对于碎片问题,CMS采用的是基于Mark=Compact算法的Serial Old回收器作为补偿措施:当内存回收不佳时,将采用Serial Old执行Full GC以达到对老年代的内存整理。

你可能感兴趣的:(GC系列,GC)