Java 并行垃圾回收 CMS算法

更多 Java 虚拟机方面的文章,请参见文集《Java 虚拟机》


CMS - Concurrent Mark - Sweep 并行标记清除算法

设置: XX:+UseConcMarkSweepGC
特点:以牺牲吞吐量为代价来获得更短暂的回收停顿(STW)时间
适用于:要求服务响应速度的应用,比如 Web 应用

缺点:

  • CMS 不会整理压缩堆空间,存在碎片。
  • 需要更多 CPU 资源:CMS 默认启动的回收线程数是(CPU 数量+3)/ 4,也就是当 CPU 在4个以上时,并发回收时垃圾收集线程不少于 25% 的 CPU 资源,并且随着 CPU 数量的增加而下降。但是当 CPU 不足4个(譬如2个)时,CMS 对用户程序的影响就可能变得很大。
  • 需要更多堆空间:由于在 GC 阶段用户线程还需要运行,那也就还需要预留有足够的内存空间给用户线程使用。

步骤:

  • 初始标记:此阶段 STW。GC 进程从 GC Roots 开始扫描,且只扫描跟 GC Roots 直接关联的对象,进行标记。速度很快。
  • 并发标记:此阶段 GC 进程和用户进程同时进行,不会 STW。GC 进程在初始标记的基础上继续向下层扫描,进行标记。
  • 并发预处理:此阶段 GC 进程和用户进程同时进行,不会 STW。GC 进程扫描老年代的对象。
  • 重新标记:此阶段 STW。修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。
  • 并发清理:此阶段 GC 进程和用户进程同时进行,不会 STW。不再被应用的对象将从堆里清除掉。
  • 并发重置:此阶段 GC 进程和用户进程同时进行,不会 STW。收集器做一些收尾的工作,以便下一次 GC 周期能有一个干净的状态。

引用:
CMS 收集器

你可能感兴趣的:(Java 并行垃圾回收 CMS算法)