(JVM)四种垃圾回收算法
在 JVM 中,垃圾回收(GC)是核心机制之一。为了提升性能与内存利用率,JVM 采用了多种垃圾回收算法。本文总结了 四种常见的 GC 算法,并结合其优缺点与应用场景进行说明。
1. 标记-清除(Mark-Sweep)
工作流程
标记:从 GC Roots 出发,标记所有存活对象。
清除:回收未标记的对象,释放内存空间。
优点
实现简单。
不需要对象移动。
缺点
会产生 内存碎片,导致大对象分配困难。
标记和清理效率相对较低。
应用
常用于 老年代(Old Generation) 的早期实现。
2. 标记-整理(Mark-Compact)
工作流程
标记:标记存活对象。
整理:将存活对象移动到一端,按顺序排列,清理边界外的内存。
优点
消除了 内存碎片。
内存利用率更高。
缺点
需要移动对象,成本较高(复制和更新引用)。
应用
常用于 老年代。
👉 老年代对象存活率高、体积大,不能用复制算法(浪费内存),也不适合只用标记-清除(碎片多),因此更适合标记-整理。
3. 复制算法(Copying)
工作流程
将内存分为两块相等的区域(From、To)。
每次只使用一块区域(From)。
GC 时,把存活对象复制到另一块区域(To),然后清空 From。
优点
无内存碎片。
内存分配只需移动指针,效率高。
缺点
内存利用率低(只能使用一半空间)。
复制存活对象需要开销。
应用
常用于 新生代(Young Generation)。
👉 新生代对象生命周期短,大部分很快被回收,存活率低,复制的开销不大。
4. 分代收集(Generational Collection)
核心思想
不同对象的生命周期不同,采用不同的回收算法:
新生代:存活率低 → 使用 复制算法,效率高。
老年代:存活率高、对象大 → 使用 标记-清除 或 标记-整理。
优点
综合利用不同算法的优势。
性能和内存利用率较高。
缺点
实现复杂。
应用
HotSpot JVM 主流实现就是基于分代收集思想的(新生代 + 老年代)。
总结对比表
算法 | 原理 | 优点 | 缺点 | 应用场景 |
---|---|---|---|---|
标记-清除 | 标记存活对象,清理未标记对象 | 实现简单 | 有碎片,效率低 | 老年代(早期) |
标记-整理 | 标记存活对象并移动整理 | 无碎片 | 对象移动,成本高 | 老年代 |
复制算法 | 复制存活对象到另一块区域 | 快,无碎片 | 浪费内存(50%利用率) | 新生代 |
分代收集 | 新生代复制 + 老年代标记整理 | 综合性能好 | 实现复杂 | 主流 JVM 使用 |
总结:
新生代:对象生命周期短 → 复制算法。
老年代:对象大、存活率高 → 标记-整理。
分代收集:融合多种算法,实际生产环境的主流方案。