1、标记-清除
标记:从根对象开始遍历所有对象并标记,遍历完成的时候,未被标记的对象就是垃圾对象。
清除:从内存中删除未被标记的对象。
这种算法简单,但是效率比较低,又会产生内存碎片。
2、标记-整理
标记:从根对象开始遍历所有对象并标记,遍历完成的时候,未被标记的对象就是垃圾对象。
整理:将被标记的对象压缩到一块内存区域,然后清理内存边界到该区域的其他空间。
这种算法主要是为了解决标记-清除带来的内存碎片的问题。
3、复制
将内存分为两块,每次都只使用其中的一块,当这一块快要耗尽时,将所有正在使用的对象复制到另一块,并将老的一块清除。
这种算法效率高,不产生碎片,但是会浪费大量的空间。
4、分代收集
目前几乎所有的 JVM 垃圾回收机制都采用分代收集的方法,将内存划分为不同的区域如新生代,老年代。在新生代中,对象死去的概率较大,并且有内存空间担保,因此可以使用复制算法回收,效率高。对于老年代,并没有多少内存空间进行担保,因此可以采用标记-清除或者标记-整理算法。
5、G1 垃圾收集器
G1 垃圾收集器算得上是分代收集方法的一种实现。它的特点是吞吐量大,支持很大的堆,支持多线程收集,可根据情况进行并行或者并发收集。G1 垃圾收集器致力于尽量减少垃圾收集对业务的影响。