标记-清除算法是Java最基础的垃圾回收算法,分标记和清除两阶段:标记阶段从GC Roots出发遍历可达对象并标记,清除阶段回收未标记对象内存,但产生碎片且需Stop-The-World暂停。
标记清除算法是 Java 垃圾回收中最基础的算法之一,它分为“标记”和“清除”两个阶段,核心思想简单直接:先找出所有存活对象并打上标记,再统一回收未被标记的对象所占内存。
从 GC Roots(如栈帧中的局部变量、静态变量、JNI 引用等)出发,沿着引用链递归遍历所有可达对象,并对每个可达对象设置标记位。这个过程采用深度优先或广度优先遍历,确保不遗漏也不重复标记。
遍历整个堆内存,将未被标记的对象所占空间释放,但不进行内存整理。这意味着空闲内存可能以碎片形式分散在堆中。
标记清除算法很少单独用于新生代或老年代的主回收器,更多作为其他算法(如 CMS、ZGC 的部分阶段)的基础组件。它的主要短板在于碎片化和 STW 时间不可控。
立即学习“Java免费学习笔记(深入)”;
与复制算法相比,标记清除不需要额外的半区空间,适合老年代这种存活率高的场景;与标记整理算法相比,它省去了移动对象的开销,但牺牲了内存连续性。