基本回收算法
1. 复制(Copying)
此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不过出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。
2. 标记-清除(Mark-Sweep)
此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。
3. 标记-整理(Mark-Compact)
此算法结合了 “标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象 “压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。
4. 分代(Generational Collecting)
垃圾收集器
串行GC(Serial GC)、并行回收GC(Parallel Scavenge)和并发回收GC(ParNew)
GC有两种类型:Scavenge GC
和Full GC
。
JVM分别对新生代和旧生代采用不同的垃圾回收机制
垃圾收集器
Serial收集器
- 新生代
- 使用复制算法
- 单线程
- 简单而高效(就单CPU),适用于Client模式
- Stop The World
Serial old 收集器
- 老年代
- 使用标记-整理算法
- 其他同Serial收集器
- 在JDK1.5 以及之前版本(Parallel Old诞生以前)中与Parallel Scavenge收集器搭配使用。
- 作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。
ParNew 收集器
- Serial收集器的多线程版本
- 默认开启的收集线程数与CPU的数量相同
- 与cms配合工作
- 其他同Serial收集器
Parallel Scavenge 收集器
- 新生代
- 复制算法
- 并行的多线程
- 达到一个可控制的吞吐量(Throughput),适合后台运算而不需要太多交互的任务(VS cms关注时间)
- GC自适应的调节策略(GC Ergonomics)
Parallel Old收集器
- 老年代
- 多线程
- “标记-整理”算法
- JDK 1.6新提供
CMS收集器
- 老年代
- 标记-清除算法
- 并发收集、低停顿
工作流程
初始标记(initial mark)-> 并发标记(concurrent mark)->重新标记(remark)-> 并发清除(concurrent sweep)
- 过程中耗时最长的并发标记和并发清除,用户线程均可执行
- 初始标记与重新标记需要”stop the world”
缺点
- 占用cpu
- 产生浮动垃圾
- 标记-清除算法产生空间碎片
重新标记(Remark) 的作用在于:
之前在并发标记时,因为是 GC 和用户程序是并发执行的,可能导致一部分已经标记为 从 GC Roots 不可达 的对象,因为用户程序的(并发)运行,又可达 了,Remark 的作用就是将这部分对象又标记为 可达对象。
至于 浮动垃圾
,因为 CMS 在 并发标记 时是并发的,GC 线程和用户线程并发执行,这个过程当然可能会因为线程的交替执行而导致新产生的垃圾(即浮动垃圾)没有被标记到;而 重新标记 的作用只是修改之前 并发标记 所获得的不可达对象,所以是没有办法处理 “浮动垃圾” 的。
remark过程标记活着的对象,从GCRoot的可达性判断对象活着,但无法标记“死亡”的对象。
如果在初始标记阶段被标记为活着,并发运行过程中“死亡”,remark过程无法纠正,因此变为浮动垃圾,需等待下次gc的到来。
G1收集器
- 并行与并发
- 分代收集
- 空间整合
- 可预测的停顿
工作流程
初始标记(Initial Marking) -> 并发标记(Concurrent Marking)-> 最终标记(Final Marking) -> 筛选回收(Live Data Counting and Evacuation)
并发阶段,用户线程可执行,其他均”stop the world”
总结
收集器 | 线程 | 区域 | 算法 | 目标 | 适用场景 |
---|---|---|---|---|---|
Serial | 串行 | 新生代 | 复制 | 响应速度优先 | 单CPU下Client模式 |
Serial Old | 串行 | 老年代 | 标记-整理 | 响应速度优先 | 单CPU下Client模式,cms后备 |
ParNew | 并行 | 新生代 | 复制 | 响应速度优先 | 多CPU下Server模式,配合cms |
Parallel Scavenge | 并行 | 新生代 | 复制 | 吞吐量优先 | 后台运算少交互 |
Parallel Old | 并行 | 老年代 | 标记-整理 | 吞吐量优先 | 后台运算少交互 |
CMS | 并发 | 老年代 | 标记-清除 | 响应速度优先 | 互联网站或B/S |
G1 | 并发 | both | 标记-整理+复制 | 响应速度优先 | 服务端,将替代cms |