垃圾回收算法(下):标记-整理、分代收集
引言:完善的垃圾回收方案 上一篇我们学习了两种基础算法: 标记-清除:简单但有碎片 标记-复制:无碎片但浪费空间 本文将学习另外两种算法,它们解决了前两种算法的缺陷: 标记-整理:无碎片且不浪费空间 分代收集:综合运用多种算法,是现代JVM的主流方案 标记-整理算法(Mark-Compact) 核心思想 分三个阶段: 标记阶段(Mark):标记所有存活对象 整理阶段(Compact):将存活对象移动到内存一端 清除阶段(Sweep):清除边界外的所有内存 与标记-清除的区别 算法 清除方式 内存布局 标记-清除 直接释放死亡对象 分散,有碎片 标记-整理 移动存活对象后清除 紧凑,无碎片 详细流程 阶段1:标记(Mark) 从GC Roots开始,标记所有可达对象。 GC Roots开始遍历 ↓ 标记对象A(可达) ↓ 标记对象B(A引用) ↓ 标记对象C(B引用) ↓ 完成标记 阶段2:整理(Compact) 将所有存活对象移动到内存的一端,使其紧密排列。 整理前: ┌────┬────┬────┬────┬────┬────┬────┬────┐ │ A │ 空 │ C │ 空 │ E │ 空 │ 空 │ H │ └────┴────┴────┴────┴────┴────┴────┴────┘ 整理后: ┌────┬────┬────┬────┬────────────────────┐ │ A │ C │ E │ H │ 空 │ └────┴────┴────┴────┴────────────────────┘ 阶段3:清除(Sweep) 清除边界后的所有内存。 ...