垃圾回收算法分类两类,第一类算法判断对象生死算法,如引用计数法、可达性分析算法。第二类是收集死亡对象方法,如标记-清除算法、标记-复制算法、标记-整理算法。

标记-清除算法

标记无用对象,然后进行清除回收。标记-清除算法(Mark-Sweep)将垃圾收集分为两个阶段:标记阶段:标记出可以回收的对象。清除阶段:回收被标记的对象所占用的空间。标记-清除算法之所以是最基础的,是因为后面讲到的垃圾收集算法都是在此算法的基础上进行改进的。

优点:实现简单,不需要对象进行移动。 缺点:标记、清除过程效率低。产生大量不连续的内存碎片,提高了垃圾回收的频率。

标记-复制算法

为了解决标记-清除算法的效率不高的问题,产生了复制(Copying)算法。它把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾收集时,遍历当前使用的区域,把存活对象复制到另外一个区域中,最后将当前使用的区域的可回收的对象进行回收。

优点:按顺序分配内存即可,时间简单、运行高效,不用考虑内存碎片。 缺点:可用的内存大小缩小为原来的一半,对象存活率高时会频繁进行复制。

标记-整理算法

标记-整理算法(Mark-Compact)算法,与标记-清除算法不同的是,在标记可回收的对象后将所有存活的对象压缩到内存的一段,使他们紧凑的排列在一起,然后对端边界以外的内存进行回收。回收后,已用和未用的内存都各自一边。

优点:解决了标记-清理算法存在的内存碎片问题。 缺点:仍需要进行局部对象移动,一定程度上降低了效率。

垃圾回收算法总结