常见的垃圾回收算法有四种:
标记清除算法
标记复制算法
标记整理算法
分代收集算法
一.标记清除算法
分为标记和清除阶段。先标记出所有不需要回收的对象,在标记完成后统一回收所有没有被标记的对象。标记清除算法是最基础的垃圾回收算法,后续的算法都是针对它的不足改进而来。
标记清除算法的弊端:
清除垃圾的效率慢:如果Java堆中包含大量对象,而其中大部分需要被回收,这时会进行大量的标记和清除,导致标记和清除的执行效率随着对象数量的增长而降低。
会产生内存碎片:标记清除后会产生不连续的内存碎片(可用的内存地址不连续),空间碎片太多可能导致程序需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾回收。
二.标记复制算法
标记复制算法解决了标记清除算法中的效率问题。它将内存分为大小相同的两块,每次使用其中的一块。当其中一块的内存使用完,就将存活的对象复制到另一块中,然后再把使用的空间一次清理。这样每次的内存回收都是对内存区间的一半进行回收。
标记复制算法的弊端:
将可用的内存缩小为原来的一半,造成空间浪费。
如果内存中多数对象是存活的,会产生大量的复制内存空间产生的开销。
三.标记整理算法
标记整理算法和标记清除算法的标记过程一样,但是标记整理算法是让所有存活的对象都向内存一端移动,然后直接清理边界以外的内存。