Mark-Sweep 标记清除算法

标记清除算法是最基础的回收算法,回收过程包括“标记”和“清除”两个阶段,过程大概是这样的:

mark_sweep

1:标记阶段时,标识出可回收的引用。

2:清除阶段时,对标记阶段所标识为的对像进行回收。

这个算法存在的最大问题是,通过该算法回收的内存区域是不连续的,会产生大量的无法被利用的内存碎片,而如果找不到连续足够多的空间,就需要触发另一个GC来进去回收。

另外,sweep阶段,当所管理的内存区域很大时(无论是否全部使用),效率也会受到影响。

但是,GC算法只是一些理论算法,而GC回收器则是基于这些算法的具体实现,通过对回收器机制的扩展和加入一些补偿措施,可以规避算法自身的缺陷。例如标记清除算法,当前最稳定高效的tenure代的回收器 ,CMS回收器,便是基于这种算法。CMS通过利用多核/线程,将并发标记阶段、并发清除阶段变为并行,通过通过一些额外的补偿方案实现内存碎片的整理,使其成为很优秀的垃圾回收器。

后续会单独用一篇博客来描述具体垃圾回收器,本文还是继续描述回收算法。需记住加收算法本身缺陷是可以通过具体实现来规避的就行了,并不是基于某种回收算法实现的回收器,就一定有该种算法存在的缺陷,如CMS。


Copying 复制算法

复制算法的出现,是为了解决标记清除所存存的问题。复制算法将容量划分两块区域,其过程如下:

gc_copying
阅读全文