垃圾回收算法介绍
垃圾回收算法
垃圾回收(GC)算法用于识别和清理堆中不再使用的对象,JVM 主要采用以下算法: 1. 标记-清除(Mark-Sweep):标记垃圾后直接清除。 2. 标记-复制(Mark-Copy):标记存活对象,复制到新区域。 3. 标记-整理(Mark-Compact):标记后整理存活对象,消除碎片。 4. 分代收集(Generational Collection):按对象生命周期分代回收。
核心点
- 识别垃圾(标记) + 回收空间。
1. 算法详解
(1) 标记-清除(Mark-Sweep)
- 原理:
- 标记:从根集(GC Roots,如栈引用、静态变量)遍历,标记存活对象。
- 清除:扫描堆,回收未标记对象。
- 优点:
- 简单,易实现。
- 不移动对象,适合存活对象多的情况。
- 缺点:
- 内存碎片:回收后空间不连续。
- 效率低:标记和清除都需全堆扫描。
- 示例:
堆: [Obj1, Obj2, Obj3]
标记: [Live, Dead, Live]
清除: [Obj1, null, Obj3]
- 适用:
- 老年代,存活对象较多。
(2) 标记-复制(Mark-Copy)
- 原理:
- 将堆分为两块区域(From 和 To)。
- 标记:标记存活对象。
- 复制:将存活对象复制到 To 区,清空 From 区。
- 交换 From 和 To。
- 优点:
- 无碎片,空间连续。
- 效率高,只处理存活对象。
- 缺点:
- 空间浪费:一半内存闲置。
- 存活对象多时复制开销大。
- 示例:
From: [Obj1, Obj2, Obj3]
标记: [Live, Dead, Live]
To: [Obj1, Obj3]
- 适用:
- 年轻代,对象存活率低。
(3) 标记-整理(Mark-Compact)
- 原理:
- 标记:标记存活对象。
- 整理:将存活对象移动到堆一端,清除剩余空间。
- 优点:
- 无碎片,空间利用率高。
- 适合存活对象多的情况。
- 缺点:
- 移动对象开销大,效率低于复制。
- 需多次扫描堆。
- 示例:
堆: [Obj1, Obj2, Obj3]
标记: [Live, Dead, Live]
整理: [Obj1, Obj3]
- 适用:
- 老年代,减少碎片。
(4) 分代收集(Generational Collection)
- 原理:
- 根据对象生命周期分为:
- 年轻代:短生命周期,频繁回收。
- 老年代:长生命周期,回收较少。
- 年轻代用标记-复制,老年代用标记-清除或整理。
- 假设:
- 弱分代假说:大部分对象朝生夕死。
- 强分代假说:存活越久越难回收。
- 过程:
- 新对象在 Eden 创建。
- Minor GC:Eden → Survivor,存活对象晋升。
- Major GC:老年代回收。
- 优点:
- 结合多种算法优点,提高效率。
- 缺点:
- 实现复杂,需调参。
- 适用:
- JVM 默认策略(如 G1、CMS)。
2. GC Roots
- 定义:
- 垃圾回收的起点。
- 来源:
- 栈中局部变量。
- 方法区静态变量。
- 本地方法栈 JNI 引用。
- 作用:
- 可达性分析,标记存活对象。
3. JVM 中的实现
- Serial:
- 单线程,标记-复制(年轻代)+ 标记-整理(老年代)。
- Parallel:
- 多线程并行,类似 Serial。
- CMS(Concurrent Mark Sweep):
- 并发标记-清除,老年代为主。
- 优点:低停顿。
- 缺点:碎片、浮动垃圾。
- G1(Garbage First):
- 分代 + 区域化(Region)。
- 标记-复制 + 整理,预测停顿时间。
图示
堆:
年轻代: [Eden | S0 | S1] --> 标记-复制
老年代: [Region1 | Region2] --> 标记-整理
4. 优缺点对比
算法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
标记-清除 | 简单,不移动对象 | 碎片,效率低 | 老年代 |
标记-复制 | 无碎片,效率高 | 空间浪费,复制成本 | 年轻代 |
标记-整理 | 无碎片,空间利用高 | 移动开销大 | 老年代 |
分代收集 | 综合优化,效率高 | 实现复杂 | 通用(JVM 默认) |
5. 延伸与面试角度
- 与 GC 收集器:
- CMS 用标记-清除。
- G1 混合复制和整理。
- 调优:
-Xmn
:调整年轻代大小。-XX:+UseG1GC
:启用 G1。- 实际应用:
- Web 服务:低停顿优先(CMS、G1)。
- 批处理:吞吐量优先(Parallel)。
- 面试点:
- 问“算法”时,提四种及优缺点。
- 问“分代”时,提假说和过程。
总结
垃圾回收算法包括标记-清除、标记-复制、标记-整理和分代收集,各有优劣,JVM 结合分代思想优化性能。面试时,可提算法原理或画堆结构,展示理解深度。