Skip to content

标记清除算法

1. 算法逻辑

标记清除算法的核心思想分为两个阶段:

  1. 标记阶段,将所有存活的对象进行标记。Java中使用可达性分析算法,从GC Root开始通过引用链遍历出所有存活对象。
  2. 清除阶段,从内存中删除没有被标记也就是非存活对象。

2. 标记清除算法的优缺点

2.1 优点

实现简单,只需要在第一阶段给每个对象维护标志位,第二阶段删除对象即可。

2.2 缺点

  1. 碎片化问题
    由于内存是连续的,所以在对象被删除之后,内存中会出现很多细小的可用内存单元。如果我们需要的是一个比较大的空间,很有可能这些内存单元的大小过小无法进行分配。
    Alt text 2.分配速度慢
    由于内存碎片的存在,需要维护一个空闲链表,极有可能发生每次需要遍历到链表的最后才能获得合适的内存空间。 Alt text