三大基础 GC 算法:标记-清除、复制、标记-整理本文是《JVM调优实战》专栏第 9 讲。上一讲我们解决了"如何判断对象已死"的问题,知道了 JVM 通过可达性分析来标记存活对象。但标记只是第一步——标记完之后,怎么把这些"死对象"清理掉?清理的策略不同,内存的使用效率和程序的性能表现也截然不同。这就像打扫房间:知道哪些是垃圾(标记)是一回事,但你是把垃圾直接扫到角落(留空隙)、把家具整体搬到一侧再清理(全挪一遍)、还是把垃圾打包扔掉再把家具摆整齐(整理归位)?每种策略的代价和效果都不一样。本讲我们就来深入 GC 的三大基础算法:标记-清除、复制和标记-整理。所有现代 GC 收集器,无论多复杂,底层都是这三种算法的组合与变体。标记-清除算法(Mark-Sweep)算法过程标记-清除是最基础的垃圾收集算法,分为两个阶段:标记阶段:从 GC Roots 出发,通过可达性分析标记出所有存活对象。清除阶段:遍历整个堆(或对应区域),回收未被标记的对象。标记阶段: [存活A] [死亡] [存活B] [死亡] [死亡] [存活C] [死亡] 清除阶段: [存活A] [ 空 ] [存活B] [ 空 ] [ 空 ] [存活C] [ 空 ]就像