(1)标记 - 清除(Mark - Sweep)算法:
最基础的算法。首先,标记出所有需要回收的对象;最后,统一回收掉所有被标记的对象;
缺点:
(a)标记和清除效率不高;
(b)标记清除后会产生大量不连续的内存碎片。空间碎片太多,可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
(2)复制(Copying)算法:
将可用内存按容量划分为大小相等的两块。每次只是用其中一块。当这一块内存用完了,就将还存活着的对象复制到另一块上,然后再把前面那块内存空间一次性清理掉。
现在商业虚拟机都采用这种收集算法回收新生代。IBM研究表明,新生代中的对象98%是朝生夕死的,故无需按照1:1的比例来划分内存空间,而是将内存划分为一块较大的Eden和两块较小的Survivor空间。每次使用Eden和其中的一块Survivor。当回收时,将Eden和Survivor中的还存活的对象一次性拷贝到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。
优点:
(a)不用考虑内存碎片等复杂情况,实现简单,运行高效;
缺点:
(a)内存利用率只有50%;
(3)标记 - 整理(Mark - Compact)算法:
适用于老年代。标记过程仍然和“标记 - 清除”算法一样,然后将所有存活的对象都向一端移动,然后清理掉端边界以外的内存。
(4)分代收集算法:
根据对象存活周期不同将内存划分为几块,如新生代、老年代。这样,就可以根据各个年代的特点采用最适当的收集算法。
新生代,采用复制算法;老年代,采用“标记 - 清除”或“标记 - 整理”算法来进行回收。