垃圾回收算法(上):标记-清除、标记-复制
引言:如何回收垃圾? 前面我们学习了如何 判断对象是否是垃圾(可达性分析),现在进入下一个问题:如何回收垃圾? 垃圾回收算法解决的核心问题: 如何标记垃圾对象? 如何清理垃圾对象占用的内存? 如何避免内存碎片? 如何提高回收效率? 业界主流的垃圾回收算法有四种: 标记-清除(Mark-Sweep) 标记-复制(Mark-Copy) 标记-整理(Mark-Compact) 分代收集(Generational Collection) 本文将深入学习前两种基础算法:标记-清除和标记-复制。 标记-清除算法(Mark-Sweep) 核心思想 分两个阶段: 标记阶段(Mark):标记所有存活的对象 清除阶段(Sweep):清除所有未标记的对象 详细流程 阶段1:标记(Mark) 从GC Roots开始,标记所有可达对象。 GC Roots开始遍历 ↓ 标记对象A(可达) ↓ 标记对象B(A引用) ↓ 标记对象C(B引用) ↓ ... 完成标记 阶段2:清除(Sweep) 遍历堆,清除所有未标记的对象。 遍历堆内存 ↓ 遇到未标记对象 → 释放内存 遇到已标记对象 → 保留(清除标记) ↓ 完成清除 图解示例 初始状态: 堆内存: ┌────┬────┬────┬────┬────┬────┬────┬────┐ │ A │ B │ C │ D │ E │ F │ G │ H │ └────┴────┴────┴────┴────┴────┴────┴────┘ GC Roots引用: A, C, E 标记阶段: ...