一、垃圾收集算法
1. 分代收集理论
- 核心思想:根据对象存活周期不同,将 Java 堆分为新生代和老年代,适配不同垃圾收集算法
- 分代依据:
- 新生代:对象存活时间短,每次 GC 大量对象(近 99%)回收,适合复制算法
- 老年代:对象存活概率高,无额外空间担保,适合标记 - 清除 / 标记 - 整理算法
- 性能差异:标记 - 清除 / 标记 - 整理算法比复制算法慢 10 倍以上
2. 三大基础垃圾收集算法
(1)标记 - 复制算法
- 原理:将内存分为大小相等的两块,每次使用一块;内存耗尽时,复制存活对象到另一块,清空原块
- 适用场景:新生代(Serial、ParNew、Parallel Scavenge 收集器)
- 优点:效率高,无内存碎片
- 缺点:内存利用率低(仅 50%)
(2)标记 - 清除算法
- 原理:
- 标记阶段:标记存活对象(或需回收对象)
- 清除阶段:统一回收未标记(或已标记)对象
- 适用场景:老年代(CMS 收集器)
- 优点:实现简单
- 缺点:
- 效率低(标记对象过多时)
- 产生大量不连续内存碎片
(3)标记 - 整理算法
- 原理:标记阶段与标记 - 清除一致,后续将所有存活对象向一端移动,清理边界外内存
- 适用场景:老年代(Serial Old、Parallel Old 收集器)
- 优点:无内存碎片,内存利用率高
- 缺点:增加对象移动开销,效率低于复制算法
3. 算法对比总结
| 算法 | 优点 | 缺点 | 适用代际 |
|---|---|---|---|
| 标记 - 复制 | 效率高、无碎片 | 内存利用率低 | 新生代 |
| 标记 - 清除 | 实现简单、无需移动 | 效率低、产生碎片 | 老年代 |
| 标记 - 整理 | 无碎片、利用率高 | 效率低、有移动开销 | 老年代 |
二、垃圾收集器
1. 收集器分类与核心特性
(1)新生代收集器
| 收集器 | 线程模型 | 算法 | 核心特点 | 参数配置 |
|---|---|---|---|---|
| Serial | 单线程 | 标记 - 复制 | 简单高效、STW 时间长 |





