标记-清除是“就地清理”,省空间但留碎片;复制算法是“换地重装”,保连续但耗空间——选哪个,本质是在内存利用率和分配效率之间做取舍。

标记-清除和复制算法是JVM垃圾回收中最基础的两种策略,核心差异在于是否移动对象、如何管理空闲内存,以及对内存布局和性能的影响。
标记-清除:不搬对象,但容易“堵车”
它分两步:先从GC Roots出发标记所有存活对象;再遍历堆,回收未被标记的内存。
- 优点:不需要额外内存空间,对象原地不动,实现简单,适合对象存活率高的场景(比如老年代)
- 缺点:清除后留下大量不连续的空闲块——即内存碎片。后续分配大对象时,哪怕总空闲够,也可能因找不到连续空间而触发额外GC,甚至OOM
- 典型应用:CMS收集器的老年代回收(追求低停顿,容忍碎片)
复制:搬干净再清场,但得预留“临时宿舍”
把内存划成两块(如From/To),只用其中一块;GC时把存活对象批量复制到另一块,然后整块清空。
- 优点:回收后内存绝对连续,无碎片;分配新对象只需移动指针,非常高效;特别适合大量对象短命的场景(如新生代)
- 缺点:理论需双倍空间(实际通过Eden:S0:S1=8:1:1等比例缓解);若存活对象多(比如90%以上),复制开销巨大,效率反不如标记-清除
- 典型应用:Serial、ParNew收集器的新生代回收










