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. 适用场景

专门用于新生代(Eden+Survivor优化版复制算法)。

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

1. 执行流程

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

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

2. 优点

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

3. 缺点

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

4. 适用场景

老年代默认回收算法,老年代对象存活率高,不适合复制算法。

五、面试简答

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

答:

  1. 标记清除:先标记存活对象,再清除垃圾。实现简单速度快,但产生大量内存碎片;CMS收集器底层使用。
  2. 复制算法:内存均分两块,存活对象复制到备用区,无碎片,新生代效率高;缺点内存利用率只有50%,用于新生代。
  3. 标记整理:标记后压缩存活对象到内存一端,消除碎片,适合老年代;缺点移动对象带来额外性能损耗。

Powered by VitePress 1.6.4 | 持续更新中