1. 标记 - 清除算法
算法分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,它的标记过程是使用引用计数算法或可达性分析算法来判断对象是否存活,对其进行标记。
不足之处:1.效率不高 2.会产生不连续的内存碎片
执行过程如下图所示:
2. 复制算法
将可用内存按容量划分为大小相等的两块,每次只使用其中一块。当这一块内存用完了,就将还存活的对象复制到另外一块上面,然后再把已经使用过的内存空间一次清理掉。
执行过程如下图所示:
3. 标记 - 整理算法
标记过程与标记-清除算法一样,但是后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理端边界以外的内存。
执行过程如下图所示:
4. 分代收集算法
当前商业虚拟机的垃圾收集都采用此算法,此算法是根据对象存活周期的不同将内存划分为几块,一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批的对象死去,只有少量存活,就选择复制算法。老年代因对象存活率高,所以采用标记-清理或标记 - 整理算法。