1.标记清除算法
1.1 原理概述
在这个算法中,主要是通过遍历GCRoot遍历引用链上的对象,如果便利到这个对象就在这个对象的Header进行标记。之后GC对所有对象从头到尾进行遍历,对于没有在Header进行标记的对象则开始进行清除。在这个地方要注意一点,这里的清除并不是指的是真的置空,把这个对象在空间中消除掉。而是把这个垃圾对象的位置设置为可覆盖。其他对象进行存储的时候可以直接存到这个地方。
1.2 缺点
效率不高,并且存在内存碎片,需要额外维护一个空闲列表。当一个对象尝试放入的时候,需要先查看这个空闲列表,根据空闲列表进行存储。
2.标记复制算法
2.1 原理概述
在这个标记复制算法中,是将存储空间分成两部分,每次使用的时候,仅仅使用其中的一块儿。当进行垃圾回收的时候,需要把有用的对象,即Header被标记的对象,复制到另外一块完全空白的空间中。之后清除掉当前使用的空间。
2.2 优点
可以完全避免掉内存空间碎片化的问题,可以进行指针碰撞进行空间的分配。
2.3 缺点
第一个缺点非常明显,浪费掉一半的空间区域。第二个缺点,就是因为改变了对象存在的空间地址。栈中的引用需要频繁变化。不过针对第二个缺点可以用句柄池的访问方式进行优化,以避免栈内变量的频繁改变。
3.标记整理算法
3.1 原理概述
这个标记整理算法是在标记清楚算法的基础上,带上了内存整理的步骤。将有用的对象依次在存储空间中进行移动存储。
3.2 优点
第一点,可以避免碎片化。第二点相对于标记复制算法节省空间。
3.3 缺点
仍然是会改变栈帧中的引用,因为移动了堆空间中有用对象的位置。需要采用句柄池访问方式降低影响。
4.分代收集算法
在堆中不同的区域采用不同的算法进行收集。
5.增量收集算法
这个算法的核心思想是,工作线程和垃圾回收线程交替执行,而不是等待垃圾回收线程全部执行结束才切换到工作线程上。而是进行并发切换运行。这样做因为线程之间切换是有性能损耗的,因此会降低整体的吞吐量。
6.分区收集算法
这个算法的整体思想是,将整个的内存区域划分为多个分区。相较于增量收集算法上,通过调整回收时分区的多少。实时修改分区的个数以调整垃圾回收线程的执行时间。