Skip to content

标记整理算法

标记整理算法也叫标记压缩算法,是对标记清理算法中容易产生内存碎片问题的一种解决方案。

1. 算法逻辑

核心思想分为两个阶段:
1.标记阶段,将所有存活的对象进行标记。Java中使用可达性分析算法,从GC Root开始通过引用链遍历出 所有存活对象。
2.整理阶段,将存活对象移动到堆的一端。清理掉存活对象的内存空间。
Alt text

2. 标记整理算法的优缺点

2.1 优点

  1. 内存使用效率高
    整个堆内存都可以使用,不会像复制算法只能使用半个堆内存
  2. 不会发生碎片化
    在整理阶段可以将对象往内存的一侧进行移动,剩下的空间都是可以分配对象的有效空间

2.2 缺点

整理阶段的效率不高:
整理算法有很多种,比如Lisp2整理算法需要对整个堆中的对象搜索3次,整体性能不佳。可以通过Two-Finger、表格算法、ImmixGC等高效的整理算法优化此阶段的性能