标记-清除算法
过程:分为标记和清除两个阶段。首先标记出所有需要回收的对象,在标记完成之后统一回收所有被标记的对象。
缺点:(1)标记和清除这两个阶段的效率都不高。
(2)标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能导致以后运行过程中需要分配较大对象时,找不到足够连续的内存而触发另一次的垃圾收集动作。
复制算法
过程: 可用内存分为两部分,每次只使用其中一块,当这块内存用完,将还存活的对象复制到另外一块上面,然后再把使用的内存空间一次性的全部清除。
缺点:内存的使用空间变成原来的一半。
标记-整理算法
过程: 。分为标记和整理两个部分。标记过程和标记-清除算法的处理流程一样,而整理过程不是对可以回收的对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
分代收集算法
过程: 根据对象存活周期的不同将内存划分为几块。一般将java堆分为新生代和老年代,根据各个年代的特点采取最适合的收集算法。新生代中有大批对象失去,少量的存活,采用复制算法,只需要少量存活对象的复制成本就可以完成收集,而老年代对象存活率高,就使用标记-清除和标记-整理算法来进行回收。当前的商业虚拟机都垃圾收集都采用这种算法。