补充几个概念:
stop the world 指该收集器执行时,将阻塞一切线程
parallel 并行,可以多线程执行
concurrent并发,用户进程可以与垃圾回收同时执行
下面介绍新生代收集器
serial收集器
顾名思义,串行收集器,在该收集器工作时,将stop the world。
优点:简单高效(相对于其他单线程收集器)
缺点:stop the world ,单线程。
parNew收集器
实际上是serial的多线程版本,很多参数与serial相同。
但是: 它是目前唯一能与CMS搭配的新生代收集器
优点:多线程,能与CMS搭配
缺点:依旧stop the world
parallel scavenge收集器
看上去参数与parNew相同,都是多线程,都是新生代,都是使用复制算法。但是,它的侧重点与ParNew不同,它注重的是 CPU利用率与最大吞吐量。
吞吐量=用户代码执行时间/(用户代码执行时间+垃圾收集时间)
优点:对于注重高CPU利用率与吞吐量的服务器来说,它与Parallel Old相搭配是非常完美的。
缺点:大致同上
下面介绍老年代收集器
serial old收集器
serial收集器的老年代版本,现在的作用一般是:JDK1.5之前与parallel scavenge搭配使用。二是作为CMS触发“concurrent mod fail”时的后备方案。
parallel old收集器
作为与 parallel scavenge搭配使用,同样注重高CPU利用率与吞吐量。
CMS收集器
注意,它使用的是标记-清除算法
可以称得上是里程碑式的收集器,它做到了真正的并发收集垃圾。
大致流程是:
初始标记——标记GCRoots
并发标记——标记不可达对象
重新标记——解决由于在并发阶段可能出现的标记错误
并发收集——并发垃圾回收
优点:并发!!
缺点:
对CPU资源敏感,当只有少于4个CPU时,即使并发清除阶段,也会让用户觉得系统变“慢”
不能处理浮动垃圾(在并发清除阶段,用户进程产生的未标记的垃圾),当清除阶段剩余的空间仍然不能满足系统所需时,就会触发“concurrent mode fail”,从而 stop the world ,由serial old 来接替清理垃圾的重担。
空间碎片问题(因为它是基于标记-清除算法)
G1收集器
又一个里程碑。同样并发,但是整体来说基于标记-整理算法。且提供了一个可预测的停顿时间(这里的实现主要是通过虚拟机对与每个要回收的垃圾,建立一个回收价值的优先队列。这也是Garbage first的来源)。
清除流程大致类似CMS。