1.Serial垃圾回收器
Serial(串行)收集器是最基本、历史最悠久的垃圾收集器了,是一个单线程收集器
它只会使用一个垃圾收集线程去完成垃圾收集工作
它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The World" ),直到它收集结束
Serial垃圾回收器在回收垃圾的时候,新生代采用标记-复制算法,老年代采用标记-整理算法。
Serial 收集器由于没有线程交互的开销,自然可以获得很高的单线程收集效率
2.ParNew收集器
Serial 收集器的多线程版本,也是新生代采用标记-复制算法,老年代采用标记-整理算法
3.CMS垃圾回收器
尽量减少stop the world(gc线程工作的时候其他用户线程无法工作)的时间,真正做到gc线程和用户线程可以同时工作
CMS 收集器是基于 “标记-清除”算法的
整个过程分为以下几个步骤:
初始标记:暂停所有的其他线程,并记录下直接与 root 相连的对象 (不直接相连,间接相连的不标记),这是一个STW阶段,其他用户线程是不能工作的
并发标记:这个阶段,CMS线程和其他用户线程在并发执行,CMS线程会从与GC Roots直接相连的对象出发,遍历整个对象图 ,进行标记对象
重新标记: 由于上一个阶段并发标记阶段其他用户线程实际上还是在运行的,有可能用户线程在这个阶段产生了新的对象(这些新的对象是没有打上标记的),这里采用三色标记法来标记那些新产生的对象 ‘
并发清理:开启用户线程,并且CMS线程堆未标记的区域进行清扫,这个阶段如果有新增对象会被标记为黑色,不做任何处理
最后并发重置就是把 标记过的对象取消标记
显然所有的阶段里面只有初始标记和重新标记的时候需要stop the world叫停其他用户线程,其他阶段都是CMS线程和用户线程可以并行的
三色标记算法:
黑色:这个对象及其所有的引用的对象都被遍历过,那这个对象就是黑色,黑色的对象不会被回收
灰色:这个对象被遍历过,但是它的部分引用还没被遍历过,在重新标记阶段会将这个对象标记为灰色
白色:这个对象没有被遍历过,在重新标记阶段如果是白色的话,这个对象将被回收
4.G1垃圾收集算法:
、
重新标记:
并发清理:
并发重置: