Skip to content

JVM垃圾回收三大算法

一、总述

HotSpot虚拟机共有三种基础垃圾回收算法:标记清除、复制算法、标记整理。虚拟机采用分代收集思想,新生代优先使用复制算法,老年代使用标记整理,CMS并发收集器底层基于标记清除实现。

二、标记清除算法(Mark-Sweep)

1. 执行流程

回收分为标记、清除两个独立阶段:

  1. 标记阶段:以GC Roots为起点遍历全部引用链,标记堆中所有存活对象;
  2. 清除阶段:完整遍历堆内存,回收所有未打上存活标记的垃圾对象。

2. 优点

逻辑简单,标记与清除操作执行速度快,底层实现成本低。

3. 缺点

回收完成后堆内存产生大量不连续空闲碎片,空闲空间零散,分配大容量对象时容易提前触发GC。

4. 适用场景

极少单独使用,CMS并发收集器底层核心依赖该算法。

三、复制算法(Copy)

1. 执行流程

将可用内存划分为两块同等大小区域:From区、To区。

  1. GC阶段标记From区内全部存活对象;
  2. 将存活对象完整复制到To区域,保证内存连续规整;
  3. 清空整个From区域,交换From与To的功能角色,本轮回收完成。

2. 优点

  1. 复制完成后内存无碎片,对象内存分配速度快;
  2. 新生代对象存活率低、垃圾占比高,复制开销小,回收效率优秀。

3. 缺点

  1. 内存利用率仅50%,一半内存空间长期闲置;
  2. 存活对象数量庞大时,复制对象的开销会大幅上升,性能较差。

4. 适用场景

专门用于新生代,HotSpot对新生代做优化,采用Eden+双Survivor结构改良复制算法。

四、标记整理算法(Mark-Compact)

1. 执行流程

分为标记、整理压缩两个阶段:

  1. 标记阶段:逻辑与标记清除完全一致,标记堆内全部存活对象;
  2. 整理压缩阶段:将所有存活对象统一向内存一端平移、紧密排列;
  3. 清理边界外侧全部垃圾,空闲内存统一集中在内存尾部。

2. 优点

回收后不存在内存碎片,分配大对象不会因碎片频繁触发GC,适配长期存活对象。

3. 缺点

需要移动大量存活对象,同时修改所有对象引用地址指向新内存位置,整体执行效率偏低。

4. 适用场景

老年代默认回收算法,老年代对象存活率高,无法使用复制算法。

五、面试简答

问:JVM有哪三种垃圾回收算法,分别介绍流程、优缺点与适用场景?

答:

  1. 标记清除:先标记存活对象,再清除未标记垃圾。实现简单执行速度快,但会产生大量内存碎片;CMS收集器底层采用该算法。
  2. 复制算法:内存均分为两块,GC时将存活对象复制到备用区域,回收后无内存碎片,新生代回收效率高;缺点内存利用率仅50%,专门用于新生代。
  3. 标记整理:标记完成后压缩所有存活对象至内存一端,消除内存碎片,适配老年代;缺点移动对象会带来额外性能损耗。

Powered by VitePress 1.6.4 | 持续更新中