• Serial
  • ParNew
  • Parallel Scavenge
  • Serial Old
  • CMS
  • Garbage First
  • ZGC

    Serial

    应该是最早期最基础的垃圾收集器了,jdk1.3以前是新生代唯一一款垃圾收集器,是一款单线程的垃圾收器在进行垃圾回收时需要停止掉用户线程来执行回收,采用的是标记-复制算法
    image.png
    单线程带来的好处就是没有多线程那样的线程间交互,只专注于垃圾回收,所以serial垃圾收集器能做到简单高效。适用于桌面应用和微服务中,这样的场景分配给虚拟机管理的内存空间不会很大,几十兆到一两百兆收集时间完全可以控制在十几毫秒到几十毫秒最多一百毫秒左右对于用户来说是完全可以接受的,非常适合运行在客户端模式下。

    ParNew

    ParNew收集器是Serial收集器的一个多线程版本,采用标记-复制算法,其余的行为都和Serial一样,两款收集器也是共用了相当一部分的代码,除了多线程收集外其他的与Serial并无差别,他也是jdk1.7前除了Serial以外唯一能和CMS收集器搭配使用的收集器了,也是使用CMS垃圾收集器默认的新生代收集器。
    image.png

    CMS

    全称(Concurrent Mark Sweep) 是一款以低停顿时间为目标的垃圾收集器,一般用于现代互联网网站和基于浏览器系统的服务端上,因为这些系统是直接面向用户的,对于服务的响应时间有着严格的要求,系统服务的响应速度直接影响着用户的体验,此款收集器是基于标记清除算法实现的,相对比前几款要复杂很多。回收过程分为以下步骤

  • 初始标记

  • 并发标记
  • 重新标记
  • 并发清除

image.png
初始标记阶段是需要 stop the world 的 这个阶段主要是标记基于GCRoot节点集合上的直接关联到的对象,时间很短。
并发标记阶段是基于初识标记出来的GCRoot为基础去遍历整个对象图,这个过程虽然时间会很长但是是可以和用户线程一起并发执行的。
重新标记则是为了修正在并发标记过程中还有用户线程不断的在改变标记对象的信息,这个阶段也是stop the world 会比初始标记时间长一些。
并发清除是清理删除掉在标记阶段找到的已死亡的对象,由于采用的是清除算法不需要移动对象,所以是可以和用户线程并发执行的。
缺点

  • cms垃圾收集器对处理器资源比较敏感
  • cms垃圾收集器存在浮动垃圾
  • cms垃圾收集器存在空间碎片化问题

    Garbage First