垃圾回收

基本回收算法

1. 复制(Copying)

此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不过出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。

2. 标记-清除(Mark-Sweep)

此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。

3. 标记-整理(Mark-Compact)

此算法结合了 “标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象 “压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。

4. 分代(Generational Collecting)

垃圾收集器
串行GC(Serial GC)、并行回收GC(Parallel Scavenge)和并发回收GC(ParNew)

GC有两种类型:Scavenge GCFull GC
JVM分别对新生代和旧生代采用不同的垃圾回收机制


垃圾收集器

gc-colloctor.png

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

G1
https://blog.csdn.net/u013380694/article/details/83341913