解释GC的标记-清除算法及其缺点。

标记-清除(Mark-Sweep)是最早的垃圾收集算法之一,其过程主要分为两个阶段:标记阶段和清除阶段。

  1. 标记阶段:这一阶段的任务是遍历所有的可达对象。从一个固定的根对象(root)开始,递归地访问对象图。在访问到每一个可达对象时,都将其标记为可达。在Java中,根对象通常包括全局变量和当前执行方法的局部变量。

  2. 清除阶段:在标记阶段完成后,清除阶段开始。在这个阶段,垃圾收集器会遍历堆内存,把未被标记(也就是不可达)的对象进行清除,回收其占用的内存。

标记-清除算法的优点是实现简单,且不需要移动存活对象。但是,它有两个显著的缺点:

  1. 效率问题:标记和清除两个过程的效率都不高。
  2. 空间问题:标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配大对象时,无法找到足够的连续内存,从而提前触发另一次垃圾收集动作。

因此,现代的垃圾收集器通常不单独使用标记-清除算法,而是结合其他算法一起使用,如标记-整理算法或分代收集算法,以解决其带来的效率和空间问题。

发表评论

后才能评论