一、垃圾回收算法
1. 标记-清除(Mark-Sweep)
- 步骤:
- 标记:遍历对象图,标记所有存活对象。
- 清除:回收未被标记的垃圾对象。
- 特点:简单,但会产生内存碎片。
2. 标记-复制(Mark-Copy)
- 步骤:
- 将内存分为两个区域(From 和 To)。
- 标记存活对象,复制到 To 区。
- 清空 From 区,交换 From/To 角色。
- 特点:无碎片,但浪费一半内存。
3. 标记-整理(Mark-Compact)
- 步骤:
- 标记存活对象。
- 整理存活对象到内存一端。
- 清理边界外的空间。
- 特点:无碎片,但整理耗时。
4. 分代收集
- 核心思想:将堆分为新生代和老年代,分别用不同算法。
- 新生代:标记-复制。
- 老年代:标记-清除或标记-整理。
二、收集器执行流程图示
1. Serial / Serial Old
[新生代(标记-复制)]
1. 暂停所有用户线程(STW)┌───────────┐ ┌───────────┐│ From区 │ ----> │ To区 ││存活对象复制│ │ 清空后作为 │└───────────┘ | 新From |└───────────┘[老年代(标记-整理)]
1. 标记存活对象
2. 整理到内存一端
3. 清理剩余空间
2. ParNew
[多线程 标记-复制]
1. STW,多个线程并行复制存活对象2. 清空 From 区
3. Parallel Scavenge / Parallel Old
[新生代(标记-复制)]
1. 多线程快速复制,专注吞吐量[老年代(标记-整理)]
1. 多线程整理,最大化利用CPU
4. CMS
[标记-清除算法]
1. 初始标记(STW短暂) --> 标记根对象│
2. 并发标记 --> 线程与用户线程并行标记│
3. 重新标记(STW) --> 修正并发期间的变动│
4. 并发清除 --> 清理垃圾(产生碎片)
5. G1
[混合算法(标记-复制 + 标记-整理)]
1. 初始标记(STW短暂) │
2. 并发标记 │
3. 最终标记(STW) │
4. 筛选回收(STW可控) --> 选择垃圾最多的Region复制/整理